第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么在 python 多處理中關(guān)閉池之前不能使用 join()

為什么在 python 多處理中關(guān)閉池之前不能使用 join()

天涯盡頭無女友 2023-09-12 17:13:35
我有一個(gè)類,它有一個(gè)方法可以進(jìn)行一些并行計(jì)算,并且經(jīng)常被調(diào)用。因此,我希望我的池在類的構(gòu)造函數(shù)中初始化一次,而不是每次調(diào)用此方法時(shí)都創(chuàng)建一個(gè)新池。在此方法中,我想使用 apply_async() 為所有工作進(jìn)程啟動(dòng)一個(gè)任務(wù),然后等待(阻塞)并聚合每個(gè)任務(wù)的結(jié)果。我的代碼如下所示:class Foo:     def __init__(self, ...):         # ...         self.pool = mp.Pool(mp.cpu_count())     def do_parallel_calculations(self, ...):         for _ in range(mp.cpu_count()):              self.pool.apply_async(calc_func, args=(...), callback=aggregate_result)                  # wait for results to be aggregated to a global var by the callback         self.pool.join()  # <-- ValueError: Pool is still running                  # do something with the aggregated result of all worker processes但是,當(dāng)我運(yùn)行此命令時(shí),我在 self.pool.join() 中收到錯(cuò)誤消息:“ValueError:池仍在運(yùn)行”?,F(xiàn)在,在所有示例中,我都看到 self.pool.close() 在 self.pool.join() 之前被調(diào)用,我認(rèn)為這就是我收到此錯(cuò)誤的原因,但我不想關(guān)閉我的池,因?yàn)槲蚁胍谀抢锵麓握{(diào)用此方法時(shí)!我不能不使用 self.pool.join(),因?yàn)槲倚枰环N方法來等待所有進(jìn)程完成,并且我不想浪費(fèi)地手動(dòng)旋轉(zhuǎn),例如使用“while not global_flag: pass”。我可以做什么來實(shí)現(xiàn)我想要做的事情?為什么多重處理不允許我加入仍然開放的池?這似乎是一件完全合理的事情。
查看完整描述

2 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

讓我們用一個(gè)真實(shí)的例子來具體說明這一點(diǎn):


import multiprocessing as mp



def calc_func(x):

    return x * x



class Foo:

    def __init__(self):

        self.pool = mp.Pool(mp.cpu_count())


    def do_parallel_calculations(self, values):

        results = []

        for value in values:

            results.append(self.pool.apply_async(calc_func, args=(value,)))

        for result in results:

            print(result.get())


if __name__ == '__main__':

    foo = Foo()

    foo.do_parallel_calculations([1,2,3])


查看完整回答
反對(duì) 回復(fù) 2023-09-12
?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

我想我設(shè)法通過在 apply_async() 返回的 AsyncResult 對(duì)象上調(diào)用 get() 來做到這一點(diǎn)。所以代碼就變成了:


def do_parallel_calculations(self, ...):

     results = []

     for _ in range(mp.cpu_count()):

          results.append(self.pool.apply_async(calc_func, args=(...)))

     aggregated_result = 0

     for result in results:

          aggregated_result += result.get()

其中 calc_func() 返回單個(gè)任務(wù)結(jié)果,不需要回調(diào)和全局變量。


這并不理想,因?yàn)槲乙匀我忭樞虻却鼈?,而不是按照它們?shí)際完成的順序(最有效的方法是減少結(jié)果),但由于我只有 4 個(gè)核心,所以幾乎不會(huì)被注意到。


查看完整回答
反對(duì) 回復(fù) 2023-09-12
  • 2 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)