iT邦幫忙

0

Python threading 新手發問[已解決]

  • 分享至 

  • xImage

小弟日前在測試一個結構,主程式搭配兩個子執行緒,我給他們代號分別為子執行緒1和子執行緒2,想請問一下,因為目的需求,我想要當子執行緒1,因異常失敗時,關閉所有線程,和主程式,請問這有可能實現嗎?我查了資料,大多似乎都是在討論主程式運行結束後,如何關閉所有線程。我的google能力真的太差= = ,因為花了太多時間,都沒能找到答案,所以才想請教一下有經驗的大大,能否分享經驗。無論如何,感謝大大的賞臉閱讀!!

def work1():
    do_something
thread1= threading.Thread(target=work1)
thread1.start() 
def work2():
    do_something
thread2= threading.Thread(target=work2)
thread2.start() 

執行主程式...

這是我目前理想中的架構,請問有可能實現嗎?

def work1():
    do_something
thread1= threading.Thread(target=work1)
def work2():
    do_something
thread2= threading.Thread(target=work2)

主程式...

def main():
    try:
        thread1.start()
        thread2.start()
        執行主程式...
    except:
       關閉所有程序
        
if __name__ == '__main__':
    main()

補充後續解決方式:

最後使用os._exit()終止所有程序了,感覺不是很好的方法,但我想要的效果有實現。
期待其他人有更好的方式可以分享一下。

os._exit()
看更多先前的討論...收起先前的討論...
franx0722 iT邦新手 2 級 ‧ 2022-05-17 08:25:14 檢舉
子程式1發生異常, 如果沒有捕抓異常訊息會關閉主程式阿
主程式關閉後子程式2也會被關閉
如果你只是需要發生異常關閉所有線程 ,那甚麼事都不做就行了
andow1198 iT邦新手 4 級 ‧ 2022-05-17 08:52:21 檢舉
那就奇怪了,我的實驗結果是子程式1異常後,子程式2仍然繼續工作,我再去確認一次,看看我是不是是有甚麼誤會,因為你這個說法,也是我剛開始我期望看到的結果。
andow1198 iT邦新手 4 級 ‧ 2022-05-17 09:56:38 檢舉
F大,我剛剛測試完了,如果是單純子程式1異常,並不會影響子程式2和主程式運作,子程式2和主程式會各自繼續獨立運作,我想這就是多線程和單線程最大的差別。
andow1198 iT邦新手 4 級 ‧ 2022-05-17 10:15:09 檢舉
另外補充,如果想要透過關閉主程式,來關閉子程式,必須使用thread = Thread(target=worker, daemon=True),子程序才會關閉。
franx0722 iT邦新手 2 級 ‧ 2022-05-18 09:23:48 檢舉
Daemon Thread 不建議 ,如果是在寫檔案 或 資料庫
這時候強制把執行續關閉容易破壞檔案, 關閉主程式應建立在寫入操作安全結束後.
假設執行續中有無限迴圈那應該有個機制可以讓它脫離
franx0722 iT邦新手 2 級 ‧ 2022-05-18 09:33:04 檢舉
try 應該是最後手段 ,當異常發生時應該是去了解為何出現異常,進而解決它.
andow1198 iT邦新手 4 級 ‧ 2022-05-19 08:49:25 檢舉
F大,謝謝回覆!!我認同你的說法,我會繼續努力學習的
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
camelcheng
iT邦新手 4 級 ‧ 2022-05-16 17:32:09
最佳解答

可以參考這篇

andow1198 iT邦新手 4 級 ‧ 2022-05-17 09:57:07 檢舉

謝謝C大,我這就去閱讀看看!!

我要發表回答

立即登入回答