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

Posted

技术标签:

【中文标题】我可以在 Linux 上打开命名管道以在 Python 中进行非阻塞写入吗?【英文标题】:Can I open a named pipe on Linux for non-blocked writing in Python? 【发布时间】:2016-01-12 21:49:14 【问题描述】:

我使用mkfifo 创建了一个fifo 文件。是否可以在不阻塞的情况下打开/写入它?我想不知道是否有读者。

以下内容:

with open('fifo', 'wb', 0) as file:
    file.write(b'howdy')

在我从另一个 shell 执行 cat fifo 之前,我只是在开放时停止。无论是否有数据消费者在观看,我都希望我的程序能够取得进展。

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

【问题讨论】:

【参考方案1】:

来自man 7 fifo

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

所以第一个解决方案是使用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)

【讨论】:

以上是关于我可以在 Linux 上打开命名管道以在 Python 中进行非阻塞写入吗?的主要内容,如果未能解决你的问题,请参考以下文章

Linux:打开命名管道进行写入时超时

简述Linux进程间通信之命名管道FIFO

打开命名管道时,构造函数上的 FileInputStream 块

为啥只读打开命名管道块?

关于命名管道,通常如何实现“握手”

我需要刷新命名管道吗?