我可以在 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 中进行非阻塞写入吗?的主要内容,如果未能解决你的问题,请参考以下文章