我的问题如下:
我的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很快就会阻塞.
用这个:
#!/usr/bin/python
import sys
for line in sys.stdin.readlines():
pass # do something useful
Run Code Online (Sandbox Code Playgroud)