2014-05-01 111 views
1

我目前使用多處理函數來分析大約10個文件。Python多重處理不等待

但是,我只想每次運行5個進程。

當我試圖實現這個,它不起作用。創建更多的流程,然後創建我指定的編號。有沒有一種方法可以輕鬆地將進程數限制爲5? (Windows 7/Python 2.7)

編輯: 恐怕您的解決方案仍然無法正常工作。我會盡量在這裏發佈更多細節;

主要的python文件;

import python1 
import python2 
import multiprocessing 

# parallel = [fname1, fname2, fname3, fname4, fname5, fname6, fname7, fname8, fname9, fname10] 
if name == '__main__': 
    pool = multiprocessing.Pool(processes=max(len(parallel), 5)) 
    print pool.map(python1.worker, parallel) 

Python1文件;

import os 
import time 
import subprocess 

def worker(sample): 
    command = 'perl '+sample[1].split('data_')[0]+'methods_FastQC\\fastqc '+sample[1]+'\\'+sample[0]+'\\'+sample[0]+' --outdir='+sample[1]+'\\_IlluminaResults\\_fastqcAnalysis' 
    subprocess.call(command) 
    return sample 

12個文件的返回語句會在所有打開的perl模塊關閉時返回。還打開了12個perl shell,而不是最大的5個。(Image;你可以清楚地看到返回語句在perl命令還沒有完成之前回來,並且有超過5個進程http://oi57.tinypic.com/126a8ht.jpg

回答

0

我不'不知道爲什麼這是一個祕密什麼不發生,發生了什麼。

並提供一個SSCCE意味着一個實際運行的程序。 (有一個看看worker()功能,例如,它得到它從未使用過file參數,並使用它無處定義的command變量)。

但我認爲這是你的fileX只是文件中的點名字和他們被試圖執行。

你的函數改爲

def worker(filename): 
    command = "echo X " + filename + " Y" 
    os.system(command) 

,它應該工作的罰款。 (請注意,我爲了不隱藏內置的名字改爲filefilename

BTW,而不是os.system()你應該使用subprocess模塊。

在這種情況下,你可以做

import subprocess 

def worker(filename): 
    command = ["echo", "X", filename, "Y"] 
    subprocess.call(command) 

這也應該這樣做。

正如文體備註:

pool = multiprocessing.Pool(processes=max(len(parallel), 5)) 

更簡單,做同樣的。


您的編輯現在使問題更加清晰。

看來,由於未知的原因,你的Perl程序退出的時間比他們真正完成的時間早。我不知道爲什麼會發生這種情況 - 也許他們會自行分叉並立即退出。或者是由於窗戶及其怪異。

只要多處理池注意到子進程聲稱完成,就可以啓動另一個子進程。

所以正確的方法是找出perl程序不按預期工作的原因。

+0

您的方法不適合我。我在我的主要問題中發佈了更多的細節。 (也許我應該提到,我導入了其他python文件,對此表示歉意) – user3589561

0

我在Linux下用python-2.7試過下面的代碼,它沒有聲明。一次只創建5個進程。

import os 
import multiprocessing 
import psutil 
from functools import partial 

def worker(pid, filename): 
# assert len(psutil.Process(pid).children(recursive=True)) == 5 # for psutil-2.x 
    assert len(psutil.Process(pid).get_children(recursive=True)) == 5 
    print(filename) 

parallel = range(0, 15) 

if __name__ == '__main__': 
# with multiprocessing.Pool(processes=5) as pool: # if you use python-3 
    pool = multiprocessing.Pool(processes=min(len(parallel), 5)) 
    pool.map(partial(worker, os.getpid()), parallel) 

當然,如果你使用使用os.system()的工人函數中,它會創建額外的進程和進程樹的樣子(使用使用os.system(「睡眠1」)這裏)

\_ python2.7 ./test02.py 
    \_ python2.7 ./test02.py 
    | \_ sh -c sleep 1 
    |  \_ sleep 1 
    \_ python2.7 ./test02.py 
    | \_ sh -c sleep 1 
    |  \_ sleep 1 
    \_ python2.7 ./test02.py 
    | \_ sh -c sleep 1 
    |  \_ sleep 1 
    \_ python2.7 ./test02.py 
    | \_ sh -c sleep 1 
    |  \_ sleep 1 
    \_ python2.7 ./test02.py 
     \_ sh -c sleep 1 
      \_ sleep 1 
+0

您的方法對我無效。我在我的主要問題中發佈了更多的細節。 (也許我應該提到我導入了其他python文件,對此表示歉意) – user3589561

+0

它本身不是'我的方法'。這就是多處理的工作原理。 不用你的perl腳本試試這段代碼。如果它工作,你的問題來自perl腳本創建分離子流程。 – ticapix