[英]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
你已經調用了close
或terminate
,你沒有,因此斷言失敗。
所以,您可能只想切換這兩個調用的順序。
或者,也許您可能對join
的用途感到困惑,並認為在使用all_responses.get()
或.wait()
之前需要調用它。 如果是這樣的話 - 你不需要這樣做; get
將阻塞,直到結果可用,之后您不需要join
。 這實際上更常見,特別是對於map
和朋友(盡管文檔中的示例通過with Pool(…) as pool:
而不是手動調用池上的任何內容)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.