繁体   English   中英

命名管道正在使用100%CPU

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM