【发布时间】:2016-09-23 14:44:03
【问题描述】:
我的 Unix 系统上有一个 Python3 进程一直在运行,我希望能够通过命名管道从仅偶尔运行的其他进程随机向它发送数据。如果命名管道没有数据,我希望我的进程继续做其他事情,所以我需要检查它是否有数据没有阻塞。
我无法弄清楚如何在不打开它的情况下进行检查,但除非我设置了非阻塞标志,否则会打开块。如果我设置了标志,如果我碰巧在读取之前或期间写入管道,它会崩溃。
这是我能做到的最好的:
import os
fifo = "pipe_test.fifo"
done = False
fd = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK)
while not done:
try:
s = os.read(fd, 1024) # buffer size may need tweaking
print(s)
done = True
except BlockingIOError as e:
pass
os.close(fd)
如果管道中没有数据,我会得到b"",然后它会退出。如果管道中有数据,它会得到一次异常,重试,然后获取数据。好像我做错了什么,可能会遇到奇怪的比赛条件。有更好的方法吗?
【问题讨论】:
-
你能用第二个线程等待阻塞管道吗?
-
@Jasper 我可以做到。这也不理想,但我承认它更好。此外,我可以使用 Python 的文件库而不是低级的
os东西,这样我就可以阅读到换行符等。谢谢,除非有办法在没有其他线程的情况下进行检查,否则我会将我的代码更改为那个。
标签: python named-pipes