![](/img/trans.png)
[英]Python multithreaded program does not exit when there is an uncaught exception in one of the threads
[英]python threading: exit program when one of many threads fail
當一個線程失敗時,我想找到一種方法讓腳本退出。 我已經嘗試了_thread.interrupt_main()
和daemon = True
如下:
import threading
import time
import _thread
def run1(x):
while True:
time.sleep(1)
print(x)
def run_and_stop(x):
i = 0
while True:
time.sleep(1)
print(x)
i += 1
if i == 5:
_thread.interrupt_main()
t1 = threading.Thread(target = run1, args = ('a', ), daemon = True)
t2 = threading.Thread(target = run1, args = ('b', ), daemon = True)
t3 = threading.Thread(target = run1, args = ('c', ), daemon = True)
t4 = threading.Thread(target = run_and_stop, args = ('d', ), daemon = True)
t1.start()
t2.start()
t3.start()
t4.start()
time.sleep(100)
這里程序應該在 5s 后退出:最后一個線程到達了interrupt_main()
命令,並且由於其他線程是守護進程,所以它們應該都關閉。
然而事實並非如此。 誰能解釋我為什么並為程序退出提供解決方案?
在 Unix 上, time.sleep time.sleep()
使用select()
。 我們可以通過kill()
或pthread_kill()
向進程發出信號或顯式地向主線程發出信號來中斷它。
至於_thread.interrupt_main
,來自這個討論:
“看看實現,_thread.interrupt_main 只是調用 PyErr_SetInterrupt。它似乎沒有發送信號。我玩了“strace”,看不到任何信號的證據。我猜它只是設置了一個標志輪詢。要真正中斷“睡眠”調用,您可能需要使用“pthread_kill”或類似的(至少在 Unix 上)。
def run_and_stop(x):
i = 0
while True:
time.sleep(1)
print(x)
i += 1
if i == 5:
os.kill(os.getpid(), signal.SIGINT)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.