【Python】OSError: handle is closed / EOFError: Ran out of input

2020-10-28 12:00:50

【問題描述】

       今天在使用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] 管道正在被關閉。