python的sys.stdin.read()是否阻塞?


问题内容

我正在为自己的目的改编此Django管理命令。该脚本是一个简单的while循环守护程序,它command.handle()根据协议从sys.stdin(第152行,in中)读取,并将结果写入sys.stdout。

我希望sys.stdin.read()阻塞直到它接收到一些东西,但是我发现当我运行此脚本时,在发送或接收任何数据之前,它会消耗100%的CPU。

  1. sys.stdin.read(n)阻塞吗?
  2. 如果没有,如何使该守护程序更礼貌?
  3. 是否time.sleep(s)使用安全,或者我会想念输入或者是反应慢了?

问题答案:

默认情况下,sys.stdin.read()sys.stdin.read(n)阻止呼叫。我假设100%CPU的消耗实际上归因于将数据流式传输到脚本中或此处未引用的其他行为。

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

读(…)

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

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

(强调我的。)

这意味着阻止模式是默认行为,这与我的经验一致。这也使我找到了关于SO的类似问题。Voila:在子进程上
进行非阻塞读取.Python中的PIPE

祝您适应愉快!