簡體   English   中英

使用多處理控制Python中的進程數

[英]Control Number of Processes in Python using multiprocessing

我想控制使用多處理程序包時產生的進程數。

假設我只希望同時激活三個進程。 我知道如何執行此操作的唯一方法是:

import multiprocessing
import Queue
def worker(arg):
    ## Do stuff
    return returnvalue

argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = Queue.Queue()
for arg in argument:
    while jobs.qsize() > 2:
        jobs.get().join()
    p = multiprocessing.Process(target=worker,args=(arg,))
    jobs.put(p)
    p.start()

基本上,我只知道如何使用Process.join()函數一次監視一個進程。 我監視最舊的過程,直到完成為止,然后創建一個新過程。 對於我的程序,平均而言,最舊的進程應該比其他進程先完成。 但是誰知道呢? 也許另一個過程會先完成,我將無從得知。

我能想到的唯一選擇是這樣的:

import multiprocessing
import time
def worker(arg):
    ## Do stuff
    return returnvalue

argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = set()
for arg in argument:
    while aliveprocesses > 2:
        for j in jobs:
            if not j.is_alive():
                aliveprocesses -= 1
                break
            time.sleep(1)
    p = multiprocessing.Process(target=worker,args=(arg,))
    jobs.put(p)
    p.start()
    aliveprocesses += 1

在上面的函數中,您正在檢查所有進程是否仍然存在。 如果它們都還活着,您可以睡一會兒,然后再次檢查,直到出現死進程,之后再生成新進程。 這里的問題是,據我了解,time.sleep()函數並不是一種等待進程結束的特別有效的方法。

理想情況下,我只想使用像Process.join()這樣的函數“ superjoin()”,它僅使用一組Process對象,並且當集合中的一個Process返回時,superjoin()將返回。 而且superjoin()本身並不使用time.sleep()函數,即它沒有被“推卸責任”

因為您似乎只有一個(並行)任務,而不是單獨管理進程,所以應該使用更高級別的multiprocessing.Pool ,這使管理進程數更加容易。

您無法join池,但是您有執行此類任務的阻塞調用(例如Pool.map )。

如果您需要更細粒度的控制,則可能需要調整Pool的源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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