2011-06-29 66 views
40

我期望在一段時間後終止一些線程。這些線程將運行一個無限的while循環,在此期間,它們可能會隨機拖延大量時間。線程的持續時間不能超過持續時間變量設置的時間。 如何在持續時間設定的長度後使線程停止。在一段時間後停止線程

def main(): 
    t1 = threading.Thread(target=thread1, args=1) 
    t2 = threading.Thread(target=thread2, args=2) 

    time.sleep(duration) 
    #the threads must be terminated after this sleep 
+2

你上次問這個問題我們建議你讓線程自行終止。你爲什麼不能那樣做? http://stackoverflow.com/questions/6523526/python-multi-threading-help – Nix

+0

你的線程會阻塞嗎? – Nix

+0

線程將以無限循環運行。線程有可能會隨機休眠一段時間。線程絕對不能在程序開始時指定的持續時間內運行。如果線程沒有多少時間他們睡着了,他們怎麼知道什麼時候結束。 – Takkun

回答

96

這將工作如果未擋住。

如果您打算睡覺,那麼您絕對需要使用該事件來進行睡眠。如果你利用這個事件進行睡眠,如果有人告訴你在「睡覺」時停下來,它會醒來。如果你使用time.sleep(),你的線程只會在醒來後停止

def main(): 
    t1_stop= threading.Event() 
    t1 = threading.Thread(target=thread1, args=(1, t1_stop)) 

    t2_stop = threading.Event() 
    t2 = threading.Thread(target=thread2, args=(2, t2_stop)) 

    time.sleep(duration) 
    #stop the thread2 
    t2_stop.set() 

def thread1(arg1, stop_event): 
    while(not stop_event.is_set()): 
     #similar to time.sleep() 
     stop_event.wait(time) 
     pass 


def thread2(arg1, stop_event): 
    while(not stop_event.is_set()): 
     stop_event.wait(time) 
     pass 
+0

你不需要通過,是嗎? – MaxNoe

+0

'stop_event.wait(time)'中的'time'應該是'1'這樣的數值變量,還是'import time'中的'time'模塊?使用這樣的模塊似乎很奇怪,所以我只是在檢查。 – mdw7326

+2

在谷歌上發現了這個問題,並且有同樣的問題,所以我決定貢獻一下。這是幾分之一秒。所以'stop_event.wait(1)'是1秒。 –

9

如果你想線程停止當你的程序退出(如暗示你的榜樣),然後讓他們daemon threads

如果你想要你的線程死於命令,那麼你必須手工完成。有各種方法,但都涉及在你的線程循環中檢查是否有時間退出(參見Nix的例子)。

相關問題