我開始與./file.py <pipe>> logfile
腳本和腳本是:命名管道是使用100%的CPU
while True:
try:
I = raw_input().strip().split()
except EOFError:
continue
doSomething()
我怎麼能更好地處理命名管道?該腳本始終以100%的CPU運行,並且需要實時,因此我無法使用time.sleep
。
我開始與./file.py <pipe>> logfile
腳本和腳本是:命名管道是使用100%的CPU
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)
,以便讓其他進程有更好的運行機會。實際上,睡眠不足實際上可能會讓您花費更長的時間,讓其他進程幾乎沒有機會填充管道!
除此之外,@美國洛特有恰到好處:「真正的-timeoid」的行爲,你必須從sys.stdin
閱讀(雖然它可能不需要一次一個字節,根據不同的平臺:通常sys.stdin.read(1024)
將讀取高達 1024字節,當sys.stdin
是一個管道或其他「原始」,而不是「熟」的FD,然而返回管道中的許多字節,如果不是等待 - 您可以設置FD到非阻塞以幫助確保),並在代碼中執行字符串操作(例如將行放在一起,剝離它們等)。