Python和FIFO

前端之家收集整理的这篇文章主要介绍了Python和FIFO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我试图在linux下使用Python来理解FIFO,我发现了一个我不理解的奇怪行为.

以下是fifoserver.py

  1. import sys
  2. import time
  3. def readline(f):
  4. s = f.readline()
  5. while s == "":
  6. time.sleep(0.0001)
  7. s = f.readline()
  8. return s
  9. while True:
  10. f = open(sys.argv[1],"r")
  11. x = float(readline(f))
  12. g = open(sys.argv[2],"w")
  13. g.write(str(x**2) + "\n")
  14. g.close()
  15. f.close()
  16. sys.stdout.write("Processed " + repr(x) + "\n")

这是fifoclient.py

  1. import sys
  2. import time
  3. def readline(f):
  4. s = f.readline()
  5. while s == "":
  6. time.sleep(0.0001)
  7. s = f.readline()
  8. return s
  9. def req(x):
  10. f = open("input","w")
  11. f.write(str(x) + "\n")
  12. f.flush()
  13. g = open("output","r")
  14. result = float(readline(g))
  15. g.close()
  16. f.close()
  17. return result
  18. for i in range(100000):
  19. sys.stdout.write("%i,%s\n" % (i,i*i == req(i)))

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

我不明白为什么当我运行服务器(使用python fifoserver.py输入输出)和客户端(使用python fifoclient.py)来自两个控制台后,一些请求客户端崩溃与f上的“管道损坏”错误.flush().请注意,在崩溃之前,我已经看到从几百到几千个正确处理的请求运行正常.

我的代码有什么问题?

最佳答案
正如其他评论所暗示的那样,你有竞争条件.

我怀疑在失败的情况下,服务器在其中一行后被暂停:

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

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

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

猜你在找的Linux相关文章