python的sys.stdin.read()会阻塞吗?

时间:2010-12-05 02:09:30

标签: python django stdin

我正在根据自己的目的调整this Django management command。该脚本是一个简单的while循环守护进程,它根据a protocol从sys.stdin(第152行,command.handle())中读取,并将结果写入sys.stdout。

我希望sys.stdin.read()在收到内容之前阻止,但我发现当我运行此脚本时,它会在发送或接收任何数据之前占用100%的CPU。

  1. sys.stdin.read(n)会阻止吗?
  2. 如果没有,我怎样才能使这个守护进程更有礼貌?
  3. time.sleep(s)是否可以安全使用,或者我会错过输入或响应缓慢?

3 个答案:

答案 0 :(得分:2)

默认情况下,sys.stdin.read()sys.stdin.read(n)会阻止来电。我认为100%CPU的消耗实际上可归因于流数据流入您的脚本或此处未引用的其他行为。

查看sys.stdin.read的帮助文档后,我注意到了这一点:

  

读(...)

     

read([size]) - >读取最多大小字节,以字符串形式返回。

     

如果size参数为负数或省略,则读取直到达到EOF。       请注意,在非阻止模式下,数据少于请求的数据       可能会被退回,即使没有给出尺寸参数。

(强调我的。)

这意味着阻止模式是默认行为,这与我的经验一致。它还让我在SO上追查类似的问题。瞧: Non-blocking read on a subprocess.PIPE in python

祝你好转!

答案 1 :(得分:1)

它在我的机器上运行正常(即在读取时CPU占用率过低的块) - 你能在之前从一个简单的命令行脚本中检查它吗?另外,我在Linux中对此进行了测试,在其他平台上可能会有所不同。

答案 2 :(得分:0)

流是否有可能已关闭(例如已发送EOF)?