我在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""
并退出。如果管道中有数据,它会出现一次异常,然后重试,最终获取数据。看起来好像我做错了什么,可能会遇到奇怪的竞态条件。有更好的方法来解决这个问题吗?