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) 

你覺得呢?任何更好的方式/想法來處理這個問題?