我正在使用./file.py < pipe >> logfile
启动脚本
并且脚本是:
while True:
try:
I = raw_input().strip().split()
except EOFError:
continue
doSomething()
我怎样才能更好地处理命名管道?此脚本始终以100%CPU运行,并且需要是实时的,因此我无法使用time.sleep
。
答案 0 :(得分:2)
在EOF,你将永远循环获得另一个EOF。 EOF之后不再进行任何输入。
EOF并不意味着数据中存在“差距”。这意味着指定的套接字已断开连接,无法再使用。
如果您需要“实时”数据,则必须从套接字读取单个字节,直到获得完整的“消息”。也许消息以'\n'
结尾。您无法使用raw_input
。
您必须使用sys.stdin.read(1)
来获取字节。
管道,BTW,是缓冲的。所以你不会得到任何实时的东西。如果你想“实时”,你必须使用UDP套接字,而不是TCP管道。
答案 1 :(得分:2)
“实时”(因为它显然是“软”实时,因为你有多个进程,而不是“硬”实时!)并不意味着“你不能使用{{ 1}}“:即使很少的睡眠会使事情变得更好 - 尝试在循环中添加time.sleep
,只是为了让其他进程有更好的运行机会。缺乏睡眠实际上可能会让你通过让其他进程填充管道的机会很少来获得更长的时间!
除此之外,@ S.Lott说得恰到好处:对于“real-timeoid”行为,你必须从time.sleep(0.01)
读取(虽然它可能不一定是一个字节,取决于平台:通常sys.stdin
将读取最多 1024字节,当sys.stdin.read(1024)
是管道或其他“原始”而不是“熟”FD时,返回但是很多字节都在管道,如果&lt; 100,而不是等待 - 你可以直接将FD设置为非阻塞以帮助确保),并在代码中稍后执行字符串操作(例如,将行放在一起,剥离它们等)。 / p>