簡體   English   中英

如何在Python 2.7中使n個進程在長度可變的作業列表上運行?

[英]How to keep n processes running on a list of jobs that vary in length in Python 2.7?

因此,我對嘗試做的工作有了一些了解:在下面,我編寫了一些代碼,這些代碼將創建4個批處理作業並運行它們。 這些作業涉及大量數據,因此我想限制一次運行的數量。 根據數據的內容,這些作業的執行時間可能在2到15分鍾之間變化。 下面,我編寫了代碼來批量運行這些作業(4個)。

當前代碼執行

所需的代碼執行

同樣,這些作業的運行時間差異很大。 因此,這似乎使得以4(或n)為批次運行作業可能會浪費時間。 例如,給定4個作業,如果3個作業需要2分鍾,而另一個作業需要10分鍾,則只有一個進程運行8分鍾。

所以我的問題是:有沒有一種方法可以為某些功能/類/任何內容提供作業列表,以便使進程和作業的數量保持恆定?

        manager = multiprocessing.Manager()
        return_dict = manager.dict()

        jobs = []

        numOFProc = 4

        for api in WellAPIs: #iterate over individual wells in a file

            p = multiprocessing.Process(target=self.processWell, args=(df,CreatingPrediction,cache,df, newColList, clustringPredictionColName,return_dict,lock))
            jobs.append(p)

            p.start()

            numOfActiveProc = len(jobs)

            if numOFProc <= numOfActiveProc:
                for proc in jobs:
                    proc.join()
                jobs = []
            print "jobs: " + str(jobs)


        for proc in jobs:
            proc.join()
        jobs = []

        for parDF in return_dict.values():
            outDf = outDf.append(parDF)

您可能正在尋找Pool

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)   # NUMBER OF PROCESSES
    print(p.map(f, [1, 2, 3]))   # APPLIES `f` TO EACH ELEMENT
    # APPEND THIS TO MY TODO LIST AND PRINT IT WHEN IT'S DONE
    p.apply_async(f, (10,), callback=print)
    print(p.apply_async(f, (10,)).get())

您可以執行Pool(4) ,然后將map與任何可迭代對象一起使用,當可迭代對象被消耗時,函數將停止。 或者,您可以使用apply async,該方法使用回調或.get()

您所描述的是一個游泳池。 multiprocessing程序包具有您可以使用的實現。 有關其用法的詳細信息,請參閱官方文檔。

暫無
暫無

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

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