我读过the python docs on multiprocessing并且我写了几个程序。
我已经搜索过Google和Stack Overflow,但无济于事。
在Linux上,我只想检查管道是否已在另一端关闭,管道可能不包含recv()
'的数据......我的代码有其他处理要做 - 所以我不希望它在我等待关闭时阻塞!
我一直在修改的最简单的例子如下,我也研究过Windows。我确信这种行为不会令人感到意外。
在 Windows :
上Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Pipe
>>> p,c=Pipe()
>>> c.close()
>>> p.poll()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python35\lib\multiprocessing\connection.py", line 257,
in poll
return self._poll(timeout)
File "C:\Program Files\Python35\lib\multiprocessing\connection.py", line 328,
in _poll
_winapi.PeekNamedPipe(self._handle)[0] != 0):
BrokenPipeError: [WinError 109] The pipe has been ended
那太棒了!我可以抓住BrokenPipeError
例外。
在 Linux :
上Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Pipe
>>> p,c=Pipe()
>>> c.close()
>>> p.poll()
True
>>>
那不是很好!有没有比调用recv()
更好的方法让我的代码阻止?
是的,我可以从另一边发送一个'END'字符串,但这似乎机械上不优雅。
感觉我错过了一个选项...