如何在linux中关闭多处理管道执行非阻塞检查?

时间:2018-04-19 12:31:51

标签: python linux multiprocessing python-multiprocessing

我读过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'字符串,但这似乎机械上不优雅。

感觉我错过了一个选项...

0 个答案:

没有答案