2012-07-11 146 views
6

我使用下面的代碼啓動線程。我如何殺死python中的線程

t = thread.start_new_thread(myfunction) 

如何從另一個線程中刪除線程t。所以基本上就代碼而言,我希望能夠做到這一點。

t.kill() 

請注意,我使用Python 2.4。

+0

請問爲什麼你使用低級*線程*模塊而不是高級*線程*庫? – 2012-07-11 11:48:19

回答

10

如果您的線程忙於執行Python代碼,則會遇到比無法殺死它更大的問題。 GIL將阻止任何其他線程甚至運行您將用來執行殺戮的任何指令。 (經過一番調查,我瞭解到口譯員會定期發佈GIL,所以前面的陳述是虛假的,但是其餘的評論仍然存在。)

您的帖子必須以合作的方式書寫。也就是說,它必須定期檢入一個信號對象,例如一個信號量,主線程可以用它來指示工作線程自動退出。

while not sema.acquire(False): 
    # Do a small portion of work… 

或:

for item in work: 
    # Keep working… 
     # Somewhere deep in the bowels… 
     if sema.acquire(False): 
      thread.exit() 
+0

如何獲得'sema'? – 2016-04-16 02:37:11

+0

https://docs.python.org/2/library/threading.html#semaphore-objects – 2016-04-16 04:53:00

+1

我的線程正在等待raw_input()....:S – ntg 2016-11-21 18:56:28

7

你不能殺死另一個線程的線程。您需要通知其他線程它應該結束。而通過「信號」我並不是指使用signal函數,我的意思是你必須安排線程之間的一些通信。

+2

關鍵是我想殺死的線程可能在一個函數中很忙,如果它變得太忙(掛起,停頓),我想突然結束它。 – pythonic 2012-07-11 11:30:20

+1

製作線程不會更好,因此它不會掛起/停頓?通常情況下,你會使用某種互斥/ sempahore /標誌來表示線程並使其脫離它的循環。 – DipSwitch 2012-07-11 11:32:29

+1

使用線程的超時,以及捕獲該超時中斷的信號處理程序。 – bos 2012-07-11 11:32:36

14

在Python,你根本無法殺死一個線程。

如果你並不真的需要有一個線程(!),你可以做什麼,而不是使用線程包(http://docs.python.org/2/library/threading.html),是使用多處理包(http://docs.python.org/2/library/multiprocessing.html)。在這裏,殺死一個進程,你可以簡單地調用方法:

yourProcess.terminate() # kill the process! 

Python會殺了你的進程(通過SIGTERM信號在Unix上,而在Windows上通過了TerminateProcess()調用)。使用Queue或Pipe時請注意使用它! (它可能會損壞在隊列/管中的數據)

注意,multiprocessing.Event並在threading.Event的相同的方式完全相同的multiprocessing.Semaphore工作和threading.Semaphore分別爲。事實上,第一個是後者的克隆。

如果您確實需要使用線程,則無法直接殺死線程。但是,您可以執行的操作是使用「守護程序線程」。事實上,在Python,線程可以被標記爲守護:沒有活着的非守護線程離開時

yourThread.daemon = True # set the Thread as a "daemon thread" 

主程序將退出。換句話說,當你的主線程(當然是一個非守護線程)將完成它的操作時,即使仍然有一些守護線程正在工作,程序也將退出。

注意,有必要在開始前設置一個主題爲守護()方法被調用!

當然,你可以,也應該使用守護即使多處理。在這裏,當主進程退出時,它會嘗試終止其所有的守護進程。

最後,請注意,sys.exit()os.kill()都沒有選擇。

+0

澄清線程vs多處理有http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul – 2015-10-15 11:02:59

+0

我喜歡這個答案....這是關於線索性質的普通的舊事實...... – repzero 2016-08-24 00:28:42