亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何并行運行帶有參數的函數?

如何并行運行帶有參數的函數?

開滿天機 2023-10-18 21:14:12
import timefrom multiprocessing import Processdef worker():    time.sleep(2)    print("Working")def runInParallel(*fns):    proc = []    for fn in fns:        p = Process(target=fn)        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)但是,如果我添加參數,worker()它就不再并行運行。import timefrom multiprocessing import Processdef worker(ii):    time.sleep(ii)    print("Working")def runInParallel(*fns):    proc = []    for fn in fns:        p = Process(target=fn)        p.start()        proc.append(p)    for p in proc:        p.join()if __name__ == '__main__':    start = time.time()    runInParallel(worker(2), worker(2), worker(2), worker(2))    print("Total time taken: ", time.time()-start)原因可能是什么?
查看完整描述

4 回答

?
精慕HU

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)


查看完整回答
反對 回復 2023-10-18
?
慕桂英546537

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)


查看完整回答
反對 回復 2023-10-18
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

要傳遞參數,您需要將它們傳遞給Process構造函數:

        p = Process(target=fn, args=(arg1,))


查看完整回答
反對 回復 2023-10-18
?
楊__羊羊

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。


查看完整回答
反對 回復 2023-10-18
  • 4 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號