我使用下面的代碼啓動線程。我如何殺死python中的線程
t = thread.start_new_thread(myfunction)
如何從另一個線程中刪除線程t
。所以基本上就代碼而言,我希望能夠做到這一點。
t.kill()
請注意,我使用Python 2.4。
我使用下面的代碼啓動線程。我如何殺死python中的線程
t = thread.start_new_thread(myfunction)
如何從另一個線程中刪除線程t
。所以基本上就代碼而言,我希望能夠做到這一點。
t.kill()
請注意,我使用Python 2.4。
如果您的線程忙於執行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()
如何獲得'sema'? – 2016-04-16 02:37:11
https://docs.python.org/2/library/threading.html#semaphore-objects – 2016-04-16 04:53:00
我的線程正在等待raw_input()....:S – ntg 2016-11-21 18:56:28
你不能殺死另一個線程的線程。您需要通知其他線程它應該結束。而通過「信號」我並不是指使用signal
函數,我的意思是你必須安排線程之間的一些通信。
在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()都沒有選擇。
澄清線程vs多處理有http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul – 2015-10-15 11:02:59
我喜歡這個答案....這是關於線索性質的普通的舊事實...... – repzero 2016-08-24 00:28:42
請問爲什麼你使用低級*線程*模塊而不是高級*線程*庫? – 2012-07-11 11:48:19