2009-08-04 90 views
5

什麼是推薦的方式來終止python中長時間運行的線程?我不能用SIGALRM,因爲終止長時間運行的python線程

如果兩個 信號和線程在同一 程序中使用的一些必須小心。 記得在使用信號和線程 同時是的基本事情是:始終執行 信號()操作在主線程 的執行。任何線程都可以執行警告(),getignal(),暫停(), setitimer()或getitimer(); 僅 主線程可以設置一個新的信號 處理程序,並在主線程將是 接收信號 (這是由Python信號 模塊執行,即使底層線程 實現支持發送 唯一的一個發信號給個別線程)。這個 意味着信號不能用作線程間通信的手段 。請改用鎖定。

更新:在我的情況下,每個線程塊 - 它使用urllib2模塊下載網頁,有時操作需要太多的時間在一個非常緩慢的網站。這就是爲什麼我想要終止這種慢線程的原因

回答

6

由於突然殺死處於阻塞調用中的線程是不可行的,因此如果可能的話,更好的方法是避免使用線程來支持不受此類問題影響的其他多任務機制。

對於OP的特定情況(線程的工作是下載網頁,並且一些線程由於行爲不當而永久阻塞),理想的解決方案是twisted--因爲它通常用於聯網任務。在其他情況下,multiprocessing可能會更好。更一般地說,當線程給出無法解決的問題時,我建議切換到其他多任務機制,而不是嘗試使線程執行至少在CPython中不適用的任務的英雄措施。

1

如果您試圖殺死其代碼無法控制的線程,則取決於該線程是否處於阻止呼叫。根據我的經驗,如果線程正確阻塞,沒有建議和便攜的方式來做到這一點。

我試圖用標準庫中的代碼(multiprocessing.manager我正在看着你)使用循環編碼且沒有退出條件時遇到了這個問題:很好!

這裏有一些可執行的線程實現(see here for an example),但是如果你自己控制了線程代碼,你應該能夠以一種方式編寫它們,你可以用一個條件變量某種。

1

使用同步對象並要求線程終止。基本上,寫合作處理這個。

如果你開始抽出python解釋器下面的線程,會發生各種奇怪的事情,而且這不僅僅是Python,大多數運行時都有這個問題。

例如,假設您在打開一個文件後終止一個線程,那麼在該應用程序終止之前該文件將無法關閉。

+0

問題是,當你有一個方法需要很長時間(例如urllib.read(),在某些情況下它會忽略超時),你我想打斷。 – kolinko 2013-09-12 15:08:09

+1

如果你在自己的線程上執行該讀取,你不能簡單地停止等待它嗎?最終它會完成/失敗/完成,然後它就死了? – 2013-09-13 06:05:07

5

正如Alex Martelli建議的那樣,您可以使用多處理模塊。它與線程模塊非常相似,所以應該讓你輕鬆入門。你的代碼可能是這樣的,例如:

import multiprocessing 

def get_page(*args, **kwargs): 
    # your web page downloading code goes here 

def start_get_page(timeout, *args, **kwargs): 
    p = multiprocessing.Process(target=get_page, args=args, kwargs=kwargs) 
    p.start() 
    p.join(timeout) 
    if p.is_alive(): 
     # stop the downloading 'thread' 
     p.terminate() 
     # and then do any post-error processing here 

if __name__ == "__main__": 
    start_get_page(timeout, *args, **kwargs) 

當然,你需要以某種方式獲得您的主頁下載代碼的返回值。爲此,您可以使用multiprocessing.Pipe或multiprocessing.Queue(或其他可用於多處理的方法)。有更多的信息,以及您可以在http://docs.python.org/library/multiprocessing.html檢查的樣本。

最後,多處理模塊包含在python 2.6中。它也可用於在Python 2.5和2.4在PyPI中(可以使用

easy_install的多處理

或只需訪問的PyPI和手動下載並安裝軟件包。

注意:我意識到這已經發布了一段時間。我遇到了類似的問題,在這裏偶然發現了Alex Martelli的建議。如果它執行我的問題,並決定分享它。 (我想感謝Alex指着我朝着正確的方向。)

相關問題