2013-02-09 58 views
1

我有一個用Python 2.7編寫的small crawling application,它使用線程來獲取大量URL。但它並沒有完全關閉或對KeyboardInterrupt做出正確響應,儘管我試圖用我在這裏找到的一些建議來解決後一問題。Threaded python應用程序不乾淨關閉

def main(): 
    ... 
    for i in range(NUMTHREADS): 
     worker = Thread(target=get_malware, args=(malq,dumpdir,)) 
     worker.setDaemon(True) 
     worker.start() 

    ... 

    malq.join() 


if __name__ == "__main__": 
    try: 
     main() 
    except KeyboardInterrupt: 
     sys.exit() 

我需要確保它能正常退出時,我按Ctrl-C或當它完成運行,而不必按Ctrl-Z和殺滅工作。

謝謝!

+0

有趣的是,我試圖與Python 2和Python 3中,發現Python 3中不會出現問題。 – icktoofay 2013-02-09 04:00:28

+0

沒有想到這一點......我想知道爲了將它移植到Python3中,我還需要做些什麼。 – 2013-02-09 04:04:28

+0

類似:http://stackoverflow.com/questions/1824418/a-clean-lightweight-alternative-to-pythons-twisted – farzad 2013-02-09 04:43:00

回答

0

有關於GIL如何影響具有IO綁定的多個線程的Python應用程序的信號處理的討論。顯然IO綁定線程會導致主線程處理時間過長,並且無法按照預期處理信號。我建議在尋找替代parallel processing options(像subprocess模塊,或multiprocessing)或異步框架(如asyncoro

+0

我想過切換到多處理,但不知道重量級的過程會有多大幫助。出於某種原因,我的印象是這些對CPU綁定應用程序更重要;那是不正確的? – 2013-02-09 04:05:34

+0

發生這種情況是因爲沒有辦法在Python(還)中設置線程優先級。 IO綁定線程等待IO事件。我記得這些問題對於具有多個IO綁定線程和1個(或更多)CPU綁定線程的應用程序是很常見的。如果你想避免重量級的過程,你也可以使用異步解決方案。 (http://docs.python.org/2/library/asyncore.html) – farzad 2013-02-09 04:12:58

+0

[Eventlet](http://eventlet.net/)也可以讓你避免重量級的進程,並且在不改變的情況下是異步的* too *你的代碼。 – icktoofay 2013-02-09 04:24:10