2016-12-02 69 views
0

我試圖通過多個論壇來解決這個問題,但仍然沒有得到解決方案的答案。 我會盡可能地具體說明我在找什麼。 我有一個用例,我需要一個線程在一定的時間後終止它自己。我不想在主線程中使用.join(timeout = x),因爲據我所知不會終止線程。我想讓這個定時事件在線程中實現,它應該在它自行終止之前做一些清理和更新。 JFYI:我不能使用運行方法中的循環來檢查狀態。我的需求是,目標函數將在run方法內被調用。基於計時器終止一個python線程

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.timer = Timer(5.0, self.timeout) 

    def run(self): 
     self.timer.start() 
     # call the target function which runs 

    def timeout(self): 
      # timeout code 
      # If timeout has been reached then thread should do some internal cleanup and terminate thread here. 
+0

線程只能合作終止。如果您調用的任何函數沒有停止機制,那麼您遇到問題。 – tdelaney

回答

0

這是使用eventlet.timeout的另一種方法。下面的target_functionThread.run塊的主要邏輯。當時間到了,它會拋出一個預定義的異常。您可以在cleanup函數中添加內部清理邏輯塊。

from eventlet.timeout import Timeout 
from eventlet import sleep 


class TimeoutError(Exception): 
    pass 


def target_function(seconds=10): 
    print("Run target functions ...") 
    for i in range(seconds, -1, -1): 
     print("Count down: " + str(i)) 
     sleep(1) 


def cleanup(): 
    print("Do cleanup ...") 

timeout = Timeout(seconds=5, exception=TimeoutError) 
try: 
    target_function(20) 
except TimeoutError: 
    cleanup() 
finally: 
    print("Timeout ...") 
    timeout.cancel() 

我希望它能滿足您的要求。

+0

謝謝特蕾莎。讓我試試這個。這可能對我有用。所以我認爲在這種情況下,線程終止於其本身? –

+0

這是否只在定時器到達後纔開始執行目標函數?我希望線程開始執行目標函數,並在達到定時器時自行終止。有沒有一種方法可以爲此工作? –

+0

@VargheseMuthalaly請上面我的更新。 – ichbinblau