2013-03-06 161 views
1

我想创建许多并行进程来利用32核心机器,但是当我看着顶部屏幕时,它只显示5个Python进程。这是我的代码: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() 

这是本机的配置:

[[email protected] ~]$ 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

让我猜测:他们都是从同一张磁盘读取的? – 2013-03-06 15:47:11

+0

uhmmm ...是... – 2013-03-06 16:06:40

+0

请问从同一张磁盘读取的含义是什么? – 2013-03-07 10:44:35

回答

4

为什么不使用所有核心的一个可能原因是,如果由pool.apply_async运行的目标函数完成太快。在这种情况下,解决方案是将更多数据发送到目标函数(因此每次调用都会执行更多的工作)。

这就像把煤铲入32炉。如果你使用一把小铲子,你可能只能在第一座炉子的煤炭用完之前到达第五座炉子。那么你必须补充第一个炉子。即使你有一堆巨大的煤,你也永远无法使用所有的炉子。如果你使用足够大的铲子,那么你可以让所有的炉子燃烧。

+0

谢谢你,但因为每个数据块约120MB – 2013-03-06 16:07:40

+0

也许一个愚蠢的问题,但什么是报告'max_processes'的价值是不是这样的? – unutbu 2013-03-06 16:15:44

+0

是的,我自己问了这个问题。我打印出来,它是64. – 2013-03-06 16:22:11

0

我有一个类似的问题,在我的情况下,我使用的Gearman,并希望每个核心有工人,最初使用的“游泳池”,但请注意,只有一名工人正在处理的消息,所以我代替“池”,代码下面使用所有的“核心 - 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) 

你觉得呢?任何更好的方式/想法来处理这个问题?