python 命名管道_Python:检查命名管道是否有数据

我的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“”,然后退出.如果管道中有数据,它会获得一次异常,重试,然后获取数据.好像我做错了什么,可能会遇到奇怪的竞争条件.有没有更好的方法来做到这一点?

最佳答案 如果您可以更改客户端的代码,我不会使用命名管道,而是

UNIX domain sockets,因为它们支持数据报:

import errno, fcntl, os, socket

服务器:

# bind socket

sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

sock.bind('pipe_test.fifo')

# set socket non-blocking

fcntl.fcntl(sock.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)

# get a datagram

try:

datagram = sock.recv(1024)

except (OSError, socket.error) as ex:

if ex.errno not in (errno.EINTR, errno.EAGAIN):

raise

else:

print('Datagram: %r' % datagram)

客户:

sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

sock.sendto('Hello!', 'pipe_test.fifo')

但您可能希望查看multithreading而不是使用非阻塞套接字.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值