有没有办法在 python 中同时使用 ThreadPool 和 Pool 来通过指定您希望使用的 CPU 和内核的数量来并行循环?
例如,我将循环执行为:
from multiprocessing.dummy import Pool as ThreadPool
from tqdm import tqdm
import numpy as np
def my_function(x):
return x + 1
pool = ThreadPool(4)
my_array = np.arange(0,1e6,1)
results = list(tqdm(pool.imap(my_function, my_array),total=len(my_array)))
对于 4 核,但我也想将它们分布在多个 CPU 上,是否有一种简单的方法来调整代码?
您对核心和 CPU 感到困惑。一般来说,出于所有目的,两者都被认为是相同的(从现在起我们称它们为处理器)。
在Python中创建线程池时,由于Python中的全局解释器锁(GIL),线程是用户级线程并且在同一处理器上运行。因为一次只有一个线程可以控制Python解释器。因此,使用(python)线程,我们在数据密集型任务中无法获得任何真正的并发性。
怎么解决这个问题呢?简单的。生成在不同处理器上运行的多个 python 进程(每个进程都有自己的解释器)。这是使用 multiprocessing(mp) 模块的地方,从调用它的父 python 进程中生成多个进程。
您可以通过运行 htop(在 linux、mac 上)并分析 python 进程的数量来验证这一点。对于 mp 模块,它们都将与调用 pool.map 函数的父脚本具有相同的名称。
- 8 核 Mac 上的代码耗时:39.7 秒
- 此代码在同一台机器上的时间:2.9s(注意我最多可以使用 8 个核心,但出于比较目的仅使用 4 个)
下面是修改后的代码:
from multiprocessing.dummy import Pool as ThreadPool
from tqdm import tqdm
import numpy as np
import time
import multiprocessing as mp
def my_function(x):
return x + 1
pool = ThreadPool(4)
my_array = np.arange(0,1e6,1)
t1 = time.time()
# results = list(tqdm(pool.imap(my_function, my_array),total=len(my_array)))
pool = mp.Pool(processes=4) # Generally, set to 2*num_cores you have
res = pool.map(my_function, my_array)
print("Time taken = ", time.time() - t1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)