簡體   English   中英

使用python multiprocess時,在(CLOSE,TERMINATE)中聲明self._state

[英]assert self._state in (CLOSE, TERMINATE) when using python multiprocess

我目前正在嘗試使用python多處理。 我使用的庫是multiprocess (非multiprocessing )。

我有以下代碼,它創建了許多計算作業,並通過映射操作運行它:

pool = multiprocess.Pool(4)
all_responses = pool.map_async(wrapper_singlerun, range(10000))
pool.join()
pool.close()

但是,每當我運行此代碼片段時,我都會收到以下錯誤:

    pool.join()
  File "/Users/davidal/miniconda3/lib/python3.6/site-packages/multiprocess/pool.py", line 509, in join
    assert self._state in (CLOSE, TERMINATE)
AssertionError

你知道為什么會發生這個錯誤嗎? 之前我使用過pool.map_async ,但我想我需要一個pool rendez-vous命令。 否則,我的PC創建了類似forkbomb的東西,它創建了太多的線程(至少,這就是我認為它做的......)

任何想法都表示贊賞!

問題是你在close之前調用了join

multiprocess似乎缺少它的文檔 ,但是,據我所知,它基本上是stdlib multiprocessing一個分支,預先monkeypatches dill in pickle ,所以multiprocessing文檔應該在這里相關。 (另外,在評論中,您說您可以通過multiprocessing來重現問題。)

所以, Pool.join說:

等待工作進程退出。 必須在使用join()之前調用close()terminate() join()

close方法是關閉隊列的發送端,以便無法添加新任務。 join方法是等待處理隊列中的所有內容的方法。 在關閉之前等待隊列排空是行不通的。

但是你在join之后就打算close ,而不是之前。 join的第一件事assert你已經調用了closeterminate ,你沒有,因此斷言失敗。

所以,您可能只想切換這兩個調用的順序。

或者,也許您可​​能對join的用途感到困惑,並認為在使用all_responses.get().wait()之前需要調用它。 如果是這樣的話 - 你不需要這樣做; get將阻塞,直到結果可用,之后您不需要join 這實際上更常見,特別是對於map和朋友(盡管文檔中的示例通過with Pool(…) as pool:而不是手動調用池上的任何內容)。

暫無
暫無

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

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