[英]CPU usage/ speed tradeoff when reading from a named pipe in python
[英]Named pipe is using 100% CPU
我使用./file.py < pipe >> logfile
启动脚本,脚本为:
while True:
try:
I = raw_input().strip().split()
except EOFError:
continue
doSomething()
我如何更好地处理命名管道? 该脚本始终在100%CPU上运行,并且需要实时运行,因此我无法使用time.sleep
。
在EOF,您将永远循环获得另一个EOF。 EOF之后将不再进行任何输入。
EOF并不意味着数据中存在“差距”。 这意味着命名的套接字已断开连接,无法再使用。
如果要“实时”数据,则必须从套接字读取各个字节,直到获得完整的“消息”。 消息可能以'\\n'
结尾。 您不能使用raw_input
。
您必须使用sys.stdin.read(1)
来获取字节。
BTW管道已缓冲。 因此,您将不会获得任何实时信息。 如果要“实时”,则必须使用UDP套接字,而不是TCP管道。
“实时”(由于要执行多个进程,显然是“软”实时,而不是“硬”实时!)并不表示“您无法使用time.sleep
”:即使很小的睡眠也会使事情变得更好-尝试在循环中添加time.sleep(0.01)
,以使其他进程有更好的运行机会。 缺乏睡眠实际上可能会使您花费更长的时间,而给其他进程的填充机会很少!
除此之外,@ S.Lott恰到好处:对于“实时类”行为,您必须从sys.stdin
读取(尽管根据平台的不同,它可能一次不必是一个字节):通常是sys.stdin.read(1024)
当sys.stdin
是管道或其他“原始”而不是“熟化” FD时, sys.stdin.read(1024)
最多可以读取1024个字节,但是如果管道中有许多字节,则返回<100,而不是等待-您可以直接将FD设置为非阻塞,以帮助确保),并在稍后的代码中执行字符串处理(例如,将线放在一起,将它们剥离)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.