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

6 投票
3 回答
10207 浏览
提问于 2025-04-16 08:03

我正在调整这个Django管理命令,让它更符合我的需求。这个脚本是一个简单的循环守护进程,它会根据某种协议从系统标准输入(sys.stdin,代码第152行,在command.handle()里)读取数据,然后把结果写到系统标准输出(sys.stdout)上。

我本以为sys.stdin.read()会在接收到数据之前一直等待,但我发现当我运行这个脚本时,它在没有发送或接收任何数据之前就占用了100%的CPU。

  1. sys.stdin.read(n)会一直等待吗?
  2. 如果不会,我该如何让这个守护进程更“礼貌”一些?
  3. time.sleep(s)使用起来安全吗?会不会错过输入或者反应慢?

3 个回答

0

有没有可能这个流已经关闭了(比如说,发送了文件结束符)?

1

在我的电脑上运行得不错(也就是说,它在读取时几乎不占用CPU资源)——你能先用一个简单的命令行脚本检查一下吗?另外,我是在Linux系统上测试的,可能在其他平台上会有所不同。

2

默认情况下,sys.stdin.read()sys.stdin.read(n) 是阻塞调用。这意味着在这些函数执行时,程序会停下来等数据输入。我猜测你看到的100% CPU使用率,可能是因为你的脚本在处理流式数据,或者有其他没有提到的原因。

我查看了sys.stdin.read的帮助文档,发现了以下内容:

read(...)

read([size]) -> 最多读取size字节,返回一个字符串。

如果size参数是负数或者没有提供,程序会一直读取,直到到达文件末尾(EOF)。注意,当处于非阻塞模式时,返回的数据可能会少于请求的数据,即使没有给出size参数。

(这是我特别强调的。)

这说明阻塞模式是默认的行为,这和我的经验是一致的。这也让我找到了类似的问题在StackOverflow上。看这里: Python中在subprocess.PIPE上进行非阻塞读取

祝你调整顺利!

撰写回答