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

时间:2016-01-12 21:49:14

标签: python linux named-pipes

我使用.delegate()创建了一个fifo文件。是否可以不受阻塞地打开/写入?无论是否有读者,我都不知道。

以下内容:

mkfifo

直到我从另一个shell执行with open('fifo', 'wb', 0) as file: file.write(b'howdy') 时才会停止。我希望我的程序能够取得进步,无论数据消费者是否正在观看。

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

1 个答案:

答案 0 :(得分:11)

来自man 7 fifo

  

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

所以第一个解决方案是使用O_NONBLOCK打开FIFO。在这种情况下,您可以检查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

另一种可能的方法是使用O_RDWR标志打开FIFO。在这种情况下它不会阻止。其他进程可以使用O_RDONLY打开它而没有问题。

import posix
posix.open('fifo', posix.O_RDWR)