python的sys.stdin.read()会阻塞吗?
我正在调整这个Django管理命令,让它更符合我的需求。这个脚本是一个简单的循环守护进程,它会根据某种协议从系统标准输入(sys.stdin,代码第152行,在command.handle()
里)读取数据,然后把结果写到系统标准输出(sys.stdout)上。
我本以为sys.stdin.read()
会在接收到数据之前一直等待,但我发现当我运行这个脚本时,它在没有发送或接收任何数据之前就占用了100%的CPU。
sys.stdin.read(n)
会一直等待吗?- 如果不会,我该如何让这个守护进程更“礼貌”一些?
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上进行非阻塞读取
祝你调整顺利!