簡體   English   中英

python 線程:當多個線程之一失敗時退出程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM