【問題描述】
今天在使用Python多程序管道(multiprocessing.Pipe)的時候報瞭如下的錯誤:
Traceback (most recent call last):
File "script/train_taobao.py", line 302, in <module>
train(model_type=Model_Type, Memory_Size=Memory_Size, Mem_Induction=Mem_Induction, Util_Reg=Util_Reg)
File "script/train_taobao.py", line 194, in train
if _stop.is_set() and train_data_pool.empty():
File "D:\anaconda\lib\multiprocessing\queues.py", line 120, in empty
return not self._poll()
File "D:\anaconda\lib\multiprocessing\connection.py", line 255, in poll
self._check_closed()
File "D:\anaconda\lib\multiprocessing\connection.py", line 136, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
(base) D:\PythonProjects\project_nlp\mimn>Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\anaconda\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "D:\anaconda\lib\multiprocessing\spawn.py", line 115, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
【相關原因分析】
下面來說一下Python多程序管道的幾種常見報錯。
1、如果管道傳送端關閉了,接收端依然還去接收的話,接收端會在接收完管道中殘存的資料之後,報如下錯誤:
raise EOFError
2、如果管道中沒有資料了,接收端還去接收的話,程式會卡死不動。
3、如果管道傳送端關閉了,傳送端依然還去傳送的話,就會報如下的錯誤:
OSError: handle is closed
也就是咱們上文中報的錯。
4、如果接收端關閉了,傳送端依然傳送的話,會報如下的錯誤:
BrokenPipeError: [WinError 232] 管道正在被關閉。