Python 和 FIFO

标签 python linux fifo broken-pipe mkfifo

我试图在 Linux 下使用 Python 理解 FIFO,但我发现了一个我不理解的奇怪行为。

下面是fifoserver.py

import sys
import time

def readline(f):
    s = f.readline()
    while s == "":
        time.sleep(0.0001)
        s = f.readline()
    return s

while True:
    f = open(sys.argv[1], "r")
    x = float(readline(f))
    g = open(sys.argv[2], "w")
    g.write(str(x**2) + "\n")
    g.close()
    f.close()
    sys.stdout.write("Processed " + repr(x) + "\n")

这是fifoclient.py

import sys
import time

def readline(f):
    s = f.readline()
    while s == "":
        time.sleep(0.0001)
        s = f.readline()
    return s

def req(x):
    f = open("input", "w")
    f.write(str(x) + "\n")
    f.flush()
    g = open("output", "r")
    result = float(readline(g))
    g.close()
    f.close()
    return result

for i in range(100000):
    sys.stdout.write("%i, %s\n" % (i, i*i == req(i)))

我还使用 mkfifo 输入mkfifo 输出 创建了两个 FIFO。

我不明白的是为什么当我从一些请求后的两个控制台,客户端崩溃并在 f.flush() 上出现“管道损坏”错误。请注意,在崩溃之前,我已经看到数百到数千个正确处理的请求运行良好。

我的代码有什么问题?

最佳答案

正如其他评论所暗示的,您有竞争条件。

我怀疑在失败的情况下,服务器会在以下行之一后暂停:

g.write(str(x**2) + "\n")
g.close()

然后客户端能够读取结果,将其打印到屏幕上,然后循环返回。然后它重新打开 f - 这成功了,因为它在服务器端仍然打开 - 并写入消息。同时,服务器已设法关闭 f。接下来,客户端的刷新在管道上执行 write() 系统调用,这会触发 SIGPIPE,因为它现在在另一端已关闭。

如果我是正确的,您应该能够通过将服务器的 f.close() 移动到 g.write(...) 之上来修复它>.

关于Python 和 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5084210/

相关文章:

c++ - 为什么 opendir() 会随机生成 ENOENT?

mysql - 将 MySQL 数据发送到 GRAYLOG 服务器

c - 使用 FIFO(名称管道)重定向标准输入

未找到 Python 模块,相对文件夹。想不通

python - 如何高效删除列表列表中的连续重复项?

Python 3 : How to ignore line breaks when using input()

c - 来自 C 的 Linux SSH

mysql - 命名 fifo 管道是否使用磁盘写入和读取?

c - unlink() 后从 FIFO 读取

python - Selenium webdriver 能否在 sendkeys 之间设置一个随机时间(以模拟人类在打字时的行为)?