2017-01-19 69 views
1

我有一個相當簡單的程序,每個任務添加到taskq中正在執行並計算一些內容,比如說30秒。這個任務'不'在某種時間或循環中運行。Python - 停止長時間運行的taskq線程

def run(self): 
    while not self.stopper.is_set(): 
     DO_MY_30_SECONDS_WORK(self) 
     self.task_done() 

現在,假設我有一個thread.event,並且這可以在任務完成之前/之後檢查。但是有沒有辦法告訴已經運行的線程停止或退出它的執行。

+0

我有一個類似於你去年的問題,並使用SIGNAL來處理這個問題。你可以用你的主線程啓動另一個線程,並在輔助線程中啓動一個時間計數器。當計數器完成時,向主線程發送信號並通過獲取信號來殺死它。你可能想看看[this](https://pymotw.com/2/signal/) – cengineer

+0

是你的任務一些python代碼,還是你使用'subprocess'運行的另一個程序? – hansaplast

+0

這只是python代碼,但可能使用curl調用.. – Jay

回答

1

如果DO_MY_30_SECONDS_WORK(self)被阻止,則無法停止正在運行的線程。那麼可以說你可以將它設置爲daemon線程,當你的主程序執行結束時它會被突然殺死,如果線程實際上持有資源(例如寫入文件)並且通常不是一個好主意一個線程。

你可以做的是重新設計DO_MY_30_SECONDS_WORK(self)並使其成爲非阻塞,這意味着將工作切割成小塊並使其在合理的時間間隔內檢查停止標誌,以便您的線程足夠響應當你告訴它這樣做時完成自己。

+0

之間謝謝...是的,這就是我要做的。我只是把它切成小塊。 – Jay