2012-08-13 143 views
5

我有一個Python GUI,用於測試我工作的各個方面。目前,我有一個「停止」按鈕,它會在每次測試結束時終止進程(可以有多個測試設置爲一次運行)。但是,一些測試需要很長時間才能運行,如果我需要停止測試,我希望它立即停止。我的想法是使用如何從Tkinter窗口立即停止Python進程?

import pdb; pdb.set_trace() 
exit 

但我不知道如何將它注入下一個代碼行。這可能嗎?

+0

你們是不是要停止蟒蛇進程或線程蟒蛇? – 2012-08-13 16:38:23

+0

它是一個單獨的線程。 – 2012-08-13 16:52:18

回答

5

如果是線程,則可以使用thread(或Python 2中的_thread)模塊通過調用thread.exit()來終止該線程,但有一個例外。

documentation

  • thread.exit():提起SystemExit異常。當沒有被捕獲, 這將導致線程無聲地退出。

一個清潔的方法(取決於您處理如何設置),將信號線使用實例變量停止處理並退出,然後調用從主線程join()方法要等到線程退出。

例子:

class MyThread(threading.Thread): 

    def __init__(self): 
     super(MyThread, self).__init__() 
     self._stop_req = False 

    def run(self): 
     while not self._stop_req: 
      pass 
      # processing 

     # clean up before exiting 

    def stop(self): 
     # triggers the threading event 
     self._stop_req = True; 

def main(): 
    # set up the processing thread 
    processing_thread = MyThread() 
    processing_thread.start() 

    # do other things 

    # stop the thread and wait for it to exit 
    processing_thread.stop() 
    processing_thread.join() 

if __name__ == "__main__": 
    main() 
+0

這不是threading.Event的一個很好的例子。該類用於使用wait方法在線程之間進行通信,通常不用信號退出。在這種情況下,一個簡單的實例變量可以正常工作。 – Genome 2014-05-09 14:59:59

+0

@Genome:相應地更新了答案 – pR0Ps 2015-10-19 15:28:34