2014-10-20 29 views
0

我當前的python腳本監聽網絡,並且如果有某個事件,事件將被保存到列表中。在整個執行時間檢查stdin上的用戶輸入

事情是,用戶也會顯示事件並對事件做出反應,但不需要立即執行,因此他會顯示消息並做出一些選擇,但他也可以作出反應(按是或否)在稍後的點。有了他的選擇,他還提供了信息,可以查看他意味着什麼事件(如:是事件123)。

我的問題是:在整個執行過程中如何等待他的輸入?我的方法,到目前爲止是在一個新的線程while循環(while(1)select.select(),所以剩下的執行過程中不堵塞:

while(1): 
    if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: 
    result = parse_userinput() 
    react_to_event(result)  

不過:在CPU運行非常非常高的,因爲無限循環的在不斷檢查輸入的線程中。

在Python腳本的整個執行時間內,有沒有更好的方法來檢查stdin上的用戶輸入?

+3

添加一個長超時會有幫助。試試'select.select([sys.stdin],[],[],10)[0]'。 – matsjoyce 2014-10-20 16:29:41

+1

我同意@matsjoyce。如果你的循環只是在等待來自'sys.stdin'的輸入而沒有其他任何東西,那就讓'select'超時。它將釋放您的CPU,而不會對其他任何事物產生不利影響。 – dano 2014-10-20 16:39:23

回答

2

爲等待在一個新的線程中完成的,你應該使用timeout選項:

while True: 
    if select.select([sys.stdin], [], [], 10)[0]: 
     ... 

您可以設置timeout選項是幾乎任何價值,因爲你不需要做任何事情都要在此線程和select只要sys.stdin準備就緒,則可以將timeout設置爲51010**9。請注意(您可能已經知道這一點,但它可能對其他用戶有用),用戶確實需要按回車鍵,然後用戶的輸入可以通過input(或Python 2中的raw_input)獲得。

在附註中,由於您只檢查一個文件/套接字,因此您可以使用普通的Pythonic空列表檢查,並刪除sys.stdin in(如上所示)。

+0

我已經知道它了,但是你得到+1和正確的答案,因爲你迫使我正確閱讀選擇文檔(實際上是超時部分)。謝啦! – user1252280 2014-10-20 18:00:55