Python等到数据在sys.stdin中

Aba*_*lus 13 python wait

我的问题如下:

我的pythons脚本通过sys.stdin接收数据,但它需要等到sys.stdin上有新数据可用.

如python的联机帮助页中所述,我使用以下代码,但它完全重载我的CPU.

#!/usr/bin/python -u
import sys
while 1:
     for line in sys.stdin.readlines():
         do something useful
Run Code Online (Sandbox Code Playgroud)

有没有什么好方法可以解决高CPU使用率?

编辑:

您的所有解决方案都不起作用.我告诉你我的问题.

您可以配置将每个日志发送到程序而不是写入日志文件的apache2守护程序.

这看起来像这样:

CustomLog "|/usr/bin/python -u /usr/local/bin/client.py" combined
Run Code Online (Sandbox Code Playgroud)

Apache2希望从我的脚本中始终运行,等待sys.stdin上的数据并解析它然后有数据.

如果我只使用for循环,脚本将退出,因为在某一点上,sys.stdin中没有数据,而apache2会说哦,你的脚本意外退出.

如果我使用while while循环,我的脚本将使用100%的cpu使用率.

Dun*_*nes 20

以下应该可行.

import sys
for line in sys.stdin:
    # whatever
Run Code Online (Sandbox Code Playgroud)

理由:

当代码进入时,代码将在stdin中迭代.如果流仍然打开,但是没有完整的行,那么循环将挂起,直到遇到换行符(并返回整行)或流关闭(返回缓冲区中剩余的内容).

关闭流后,不能再向stdin写入数据或从stdin读取数据.期.

你的代码重载你的cpu的原因是,一旦stdin被关闭,任何后续迭代stdin的尝试都将立即返回而不做任何事情.实质上,您的代码等同于以下内容.

for line in sys.stdin:
    # do something

while 1:
    pass # infinite loop, very CPU intensive
Run Code Online (Sandbox Code Playgroud)

如果您发布了如何将数据写入stdin,那么它可能会有用.

编辑:

Python将(for for循环,迭代器和readlines()的目的考虑在遇到EOF字符时关闭一个流.你可以让python在此之后读取更多数据,但你不能使用任何以前的方法.sthon man页面建议使用

import sys
while True:
    line = sys.stdin.readline()
    # do something with line
Run Code Online (Sandbox Code Playgroud)

遇到EOF字符时,readline将返回一个空字符串.如果流仍处于打开状态,则对readline的下一次调用将正常运行.您可以通过在终端中运行命令来自行测试.按ctrl + D将使终端将EOF字符写入stdin.这将导致此帖子中的第一个程序终止,但最后一个程序将继续读取数据,直到实际关闭流.最后一个程序不应该100%你的CPU作为readline将等待,直到有数据返回而不是返回一个空字符串.

当我从实际文件尝试readline时,我只有繁忙的循环问题.但是当从stdin读取时,readline很快就会阻塞.


ham*_*ene 3

用这个:

#!/usr/bin/python
import sys
for line in sys.stdin.readlines():
    pass # do something useful
Run Code Online (Sandbox Code Playgroud)

  • 不。“for”循环将挂起等待更多数据。当 stdin 关闭时,循环将结束,脚本将继续执行。 (2认同)