2012-08-22 73 views
5

我想完成一種方法來產生一個等待用戶輸入的線程;如果在10秒內沒有輸入任何輸入,我希望腳本殺死衍生線程並繼續處理。如果輸入文本,我有辦法從線程獲取輸入,但我無法讓超時消除新產生的線程。等待用戶輸入在單獨的線程

在下面的例子中是最接近的我來了。我告訴新創建的線程它是一個守護進程,當主腳本退出時它會退出。我遇到的問題是線程將繼續等待,直到腳本退出或用戶輸入了某些內容。

shared_var = ['1'] 
def run(ref): 
    ref[0] = raw_input("enter something: ") 
    print "shared var changed to '%s'" % (ref[0]) 

thread = threading.Thread(target=run, args=(shared_var,)) 
thread.daemon = True 
thread.start() 
time.sleep(10) # simplified timeout 

#Need some way to stop thread if no input has been entered 
print "shared var = " + shared_var[0] 

我知道突然殺線程沒有去(Related Link)的最佳方式,但我不知道如何中斷新的線程,你的情況不要等待的raw_input的

回答

3

貌似是沒有辦法的時間用戶輸入。在SmartElectron提供的鏈接中,該解決方案無法工作,因爲一旦請求了raw_input,定時器就會暫停。

最好的解決方案至今是:

# Declare a mutable object so that it can be pass via reference 
user_input = [None] 

# spawn a new thread to wait for input 
def get_user_input(user_input_ref): 
    user_input_ref[0] = raw_input("Give me some Information: ") 

mythread = threading.Thread(target=get_user_input, args=(user_input,)) 
mythread.daemon = True 
mythread.start() 

for increment in range(1, 10): 
    time.sleep(1) 
    if user_input[0] is not None: 
     break 
1

不用擔心突然關閉線程。在鏈接中,說

這通常是一個壞的模式,以python和任何語言突然殺死一個線程。請考慮以下情況:

  • 線程正在持有必須正確關閉的關鍵資源。
  • 該線程創建了其他幾個線程,這些線程也必須被終止。

關閉數據庫連接,打開的文件等資源需要是 正確關閉,在這種情況下,關閉線程正確是 根本。在這種情況下,您的解決方案是有效的。*

如果此解決方案不能滿足您可以使用How to set time limit on input