我可以在Linux上打开一个命名管道,用于在Python中进行非阻塞写入吗?

Tra*_*ggs 8 python linux named-pipes

我使用创建了一个fifo文件mkfifo.是否可以不受阻塞地打开/写入?我想知道是否有读者是不可知论者.

下列:

with open('fifo', 'wb', 0) as file:
    file.write(b'howdy')
Run Code Online (Sandbox Code Playgroud)

只是在开放时停止,直到我cat fifo从另一个外壳做.我希望我的程序能够取得进步,无论数据消费者是否正在观看.

我应该使用不同的Linux机制吗?

Ole*_*nov 12

来自man 7 fifo:

进程可以在非阻塞模式下打开FIFO.在这种情况下,即使在写入端没有打开任何人,打开或只读也会成功,只读打开将因ENXIO(没有这样的设备或地址)而失败,除非另一端已经打开.

所以第一个解决方案就是打开FIFO O_NONBLOCK.在这种情况下,您可以检查errno:如果等于ENXIO,则可以稍后尝试打开FIFO.

import errno
import posix

try:
    posix.open('fifo', posix.O_WRONLY | posix.O_NONBLOCK)
except OSError as ex:
    if ex.errno == errno.ENXIO:
        pass # try later
Run Code Online (Sandbox Code Playgroud)

另一种可能的方法是用O_RDWR标志打开FIFO .在这种情况下它不会阻止.其他过程可以O_RDONLY毫无问题地打开它.

import posix
posix.open('fifo', posix.O_RDWR)
Run Code Online (Sandbox Code Playgroud)