Python multiprocessing.Pool有很多进程

时间:2013-03-06 15:44:49

标签: python parallel-processing multicore numa

我正在尝试创建许多并行进程以利用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

谢谢!


现在有效。我的代码肯定有问题,但我无法回滚看看它是什么。闭合。

2 个答案:

答案 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)
你怎么看?有没有更好的方法/想法来处理这个?