2010-06-17 107 views
0

我開始與./file.py <pipe>> logfile 腳本和腳本是:命名管道是使用100%的CPU

while True: 
    try: 
      I = raw_input().strip().split() 
    except EOFError: 
      continue 
    doSomething() 

我怎麼能更好地處理命名管道?該腳本始終以100%的CPU運行,並且需要實時,因此我無法使用time.sleep

回答

2

在EOF你會永遠循環獲得另一個EOF。在EOF之後不再有輸入。

EOF並不意味着數據中的「間隙」。這意味着指定的套接字已斷開連接並且不能再使用。

如果你想要「實時」數據,你必須從套接字讀取單個字節,直到你得到一個完整的「消息」。也許一條消息以'\n'結尾。您不能使用raw_input

您必須使用sys.stdin.read(1)來獲取字節。

管道BTW被緩衝。所以你不會得到實時的任何東西。如果你想「實時」你必須使用UDP套接字,而不是TCP管道。

2

「實時」(!因爲這顯然是「軟」實時給你有多個進程去,而不是「硬」實時)並不意味着「你不能使用time.sleep」:甚至一個微小睡眠數量會讓事情變得更好 - 嘗試在循環中添加一個time.sleep(0.01),以便讓其他進程有更好的運行機會。實際上,睡眠不足實際上可能會讓您花費更長的時間,讓其他進程幾乎沒有機會填充管道!

除此之外,@美國洛特有恰到好處:「真正的-timeoid」的行爲,你必須從sys.stdin閱讀(雖然它可能不需要一次一個字節,根據不同的平臺:通常sys.stdin.read(1024)將讀取高達 1024字節,當sys.stdin是一個管道或其他「原始」,而不是「熟」的FD,然而返回管道中的許多字節,如果不是等待 - 您可以設置FD到非阻塞以幫助確保),並在代碼中執行字符串操作(例如將行放在一起,剝離它們等)。