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