我正在尝试创建许多并行进程以利用32核机器,但是当我查看顶部屏幕时,它只显示了5个Python进程。这是我的代码:
max_processes = min(len(corpus_paths), cpu_count()*2)
__log.debug("Max processes being used: " + str(max_processes))
pool = Pool(max_processes)
for path in corpus_paths:
pool.apply_async(...)
pool.close()
pool.join()
这是机器的配置:
[minh.lengoc@compute-1-5 ~]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 8
CPU socket(s): 2
NUMA node(s): 4
Vendor ID: AuthenticAMD
CPU family: 21
Model: 1
Stepping: 2
CPU MHz: 2099.877
BogoMIPS: 4199.44
Virtualization: AMD-V
L1d cache: 16K
L1i cache: 64K
L2 cache: 2048K
L3 cache: 6144K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14
NUMA node1 CPU(s): 16,18,20,22,24,26,28,30
NUMA node2 CPU(s): 1,3,5,7,9,11,13,15
NUMA node3 CPU(s): 17,19,21,23,25,27,29,31
谢谢!
现在有效。我的代码肯定有问题,但我无法回滚看看它是什么。闭合。
答案 0 :(得分:4)
为什么不使用所有核心的一个可能原因是pool.apply_async运行的目标函数完成得太快。在这种情况下,解决方案是将更多数据发送到目标函数(因此每次调用会执行更多工作)。
就像将煤炭铲入32个炉子一样。如果你使用一把小铲子,你可能只能在第一炉中的煤用完之前到达第五炉。然后你必须重新填充第一个炉子。你永远不会使用所有的熔炉,即使你有一大堆煤。如果你使用足够大的铲子,那么你可以让所有的炉子燃烧。
答案 1 :(得分:0)
我有一个类似的问题,在我的情况下我使用的是gearman并希望每个核心都有工人,最初使用“Pool”但是注意到只有一个工人正在处理这些消息,所以我用下面的代码替换“Pool”使用所有“核心 - 1”,这样我就可以让工人同时读取队列:
if __name__ == '__main__':
jobs = []
for i in range(multiprocessing.cpu_count() - 1):
p = multiprocessing.Process(target=start_worker)
jobs.append(p)
p.start()
for j in jobs:
j.join()
print '%s.exitcode = %s' % (j.name, j.exitcode)
你怎么看?有没有更好的方法/想法来处理这个?