[英]Python Multiprocessing does not wait
我目前正在使用多處理功能來分析大約10個文件。
但是,我每次只想運行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
在所有打開的perl模塊都已關閉之前,將返回12個文件的return語句。 還打開了12個perl shell,而不是最多打開了5個。(圖像;您可以清楚地看到return語句在perl命令甚至完成之前就返回了,並且有5個以上的進程http://oi57.tinypic.com /126a8ht.jpg )
我不知道為什么什么秘密和什么反而是秘密。
提供SSCCE意味着程序可以實際運行。 (例如,查看worker()
函數。它獲取一個從未使用過的file
參數,並使用一個未定義的command
變量。)
但是我認為這是您的fileX
只是文件名,並且試圖執行它們的要點。
將功能更改為
def worker(filename):
command = "echo X " + filename + " Y"
os.system(command)
它應該可以正常工作。 (請注意,為了不隱藏內置名稱,我將file
更改為filename
名。)
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程序無法按預期工作的原因。
我在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)
當然,如果在worker函數中使用os.system(),它將創建額外的進程,並且進程樹看起來像(在此處使用os.system('sleep 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.