簡體   English   中英

Python多處理不等待

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM