4 回答

TA貢獻1845條經驗 獲得超8個贊
您應該修改runInParallel以進行可迭代的解包。
import time
from multiprocessing import Process
def worker(ii):
time.sleep(ii)
print("Working")
def runInParallel(*fns):
proc = []
for fn in fns:
func, *args = fn
p = Process(target=func, args=args)
p.start()
proc.append(p)
for p in proc:
p.join()
if __name__ == '__main__':
start = time.time()
runInParallel((worker, 2), (worker, 3), (worker, 5), (worker, 2))
print("Total time taken: ", time.time()-start)

TA貢獻1848條經驗 獲得超10個贊
worker這是因為和之間的差異worker()。前者是函數,后者是函數調用。線路上發生的情況runInParallel(worker(2), worker(2), worker(2), worker(2))是,在開始執行之前,所有四個調用runInParallel都已運行。如果你print(fns)在開頭添加一個,runInParallel你會看到一些不同。
快速解決:
def worker_caller():
worker(2)
和:
runInParallel(worker_caller, worker_caller, worker_caller, worker_caller)
這不是很方便,但主要是為了顯示問題所在。問題不在函數中worker。問題在于您混淆了傳遞函數和傳遞函數調用。如果您將第一個版本更改為:
runInParallel(worker(), worker(), worker(), worker())
那么你會遇到完全相同的問題。
但你可以這樣做:
runInParallel(lambda:worker(2), lambda: worker(2), lambda: worker(2), lambda: worker(2))
Lambda 非常有用。這是另一個版本:
a = lambda:worker(2)
b = lambda:worker(4)
c = lambda:worker(3)
d = lambda:worker(1)
runInParallel(a, b, c, d)

TA貢獻1943條經驗 獲得超7個贊
Process 構造函數接受 args 和 kwargs 參數,然后在執行時將這些參數傳遞給進程。文檔對此非常清楚。
所以你的代碼應該修改如下:
def worker(ii):
time.sleep(ii)
print("Working")
def runInParallel(*fns):
proc = []
for fn in fns:
p = Process(target=fn, args=(2,))
p.start()
proc.append(p)
for p in proc:
p.join()
if __name__ == '__main__':
start = time.time()
runInParallel(worker, worker, worker, worker)
print("Total time taken: ", time.time()-start)
當然,每個進程的參數可能不同,您需要安排將正確的參數傳遞給 args(或關鍵字參數的 kwargs)中的每個進程。這可以通過傳遞元組來實現,例如runInParallel((worker,2), (worker,3), (worker,5), (worker,1),然后處理內部的元組runInParallel。
添加回答
舉報