1. 程式人生 > >如何讓Python執行緒支援excepthook

如何讓Python執行緒支援excepthook

在遊戲中,一般會在主執行緒開始時,設定一個 excepthook,來對程式異常進行特定處理。

每個執行緒都有自己的棧,只要在發生異常時,能夠把自己的呼叫棧和異常的相關資訊,發給特定的異常處理函式(比如使用者自定義的函式)處理,就可以實現 excepthook。理論上任何語言實現的執行緒,都可以實現 excepthook,只是對執行緒的異常捕獲和 excepthook 的實現有要求。在 excepthook 實現中,如果有對資源(比如日誌檔案)和全域性變數的訪問,需要做好執行緒互斥處理。在工作執行緒中,當發生異常並逐級向上拋時,如果在最上層(工作執行緒的 main 函式)還沒有被捕獲,則執行緒會被異常終止;此時,設定的 excepthook 可能就無法發生作用了。

對 Python 執行緒而言,需要明確幾點:
1,自定義的 excepthook 是賦值給 sys.excepthook 的。
2,程式啟動時,bulit-in 的 sys.excepthook 會被儲存在 sys.__excepthook__ 中。
3,當工作執行緒發生異常並被捕獲時,如果有使用者自定義的 excepthook,就應該交由該函式處理。

再來看 Python 庫中 threading.py 的實現,在 Thread.__bootstrap_inner() 函式中,呼叫 run() 後捕捉的異常,沒有對使用者自定義的 excepthook 進行判斷,也就導致了 Python 執行緒的 excepthook 無法生效。如果把程式碼改為如下(...... 表示保持原來的程式碼不變):

    try:
        self.run()
    except SystemExit:
        ......
    except:
        ......
        if _sys:
        	if id(_sys.excepthook) != id(_sys.__excepthook__):
        		exc_type, exc_value, exc_tb = self.__exc_info()
        		_sys.excepthook(exc_type, exc_value, exc_tb)
        	else:
                _sys.stderr.write("Exception in thread %s:\n%s\n" %
                              (self.getName(), _format_exc()))
        else:
        	......

則線上程中發生異常時,預設的 excepthook 就可以正常生效了。

相關推薦

如何Python執行支援excepthook

在遊戲中,一般會在主執行緒開始時,設定一個 excepthook,來對程式異常進行特定處理。 每個執行緒都有自己的棧,只要在發生異常時,能夠把自己的呼叫棧和異常的相關資訊,發給特定的異常處理函式(比如使用者自定義的函式)處理,就可以實現 excepthook。理論上任何語言

python執行中join和和setDaemon

join([timeout]) 主執行緒A中,建立子執行緒B,B呼叫join函式會使得主執行緒阻塞,直到子執行緒執行結束或超時。引數timeout是一個數值型別,用來表示超時時間,如果未提供該引數,那麼主調執行緒將一直阻塞直到子執行緒結束。 注意:必須在start() 方法呼叫之後設

JAVA裡面如何一個執行死亡或結束

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[Python_5] Python 執行

  0. 說明   Python 執行緒筆記      1. 低階 API # -*-coding:utf-8-*- """ 執行緒 """ """ 低階 API """ import time import _thread

python執行:threading

執行緒的概念:簡單理解就是作業系統對cup資源的分配排程 下面用例項來講一下threading的用法: 我們假設你想聽歌、看電影來度過愉快的週末,以前的作業系統都是單個處理任務,但是現在cpu,你可以同時做很多種事情。 直接上程式碼,程式碼上看註釋 import threading

一句話介紹python執行、程序和協程

一、程序: Python的os模組封裝了常見的系統呼叫,其中就包括fork。而fork是linux常用的產生子程序的方法,簡言之是一個呼叫,兩個返回。 在python中,以下的兩個模組用於程序的使用。詳細就不展開。 multiprocessing:跨平臺版本的多程序模組。 Pool:程序池 Queu

Python 執行和程序

一、什麼是執行緒   1、執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。每個程序至少包含一個執行緒. 二、什麼是程序   1、一個程序就是一個程式的例項,每個程

利用threading模組和queue模組在python3直譯器上建立一個簡單的python執行

python直譯器沒提供執行緒池模組,故在python3上自定義python執行緒池簡單版本,程式碼如下 #用threading queue 做執行緒池 import queueimport threadingclass ThreadPool(): def __init__(self,arg):#建

python--執行同步原語

Threading模組是python3裡面的多執行緒模組,模組內集成了許多的類,其中包括Thread,Condition,Event,Lock,Rlock,Semaphore,Timer等等。下面這篇文章主要通過案例來說明其中的Event和Segmaphore(Boundedsegmaphore)的使用。關於

python執行同步原語--原始碼閱讀

前面兩篇文章,寫了python執行緒同步原語的基本應用。下面這篇文章主要是通過閱讀原始碼來了解這幾個類的內部原理和是怎麼協同一起工作來實現python多執行緒的。 相關文章連結:python同步原語--執行緒鎖         

自定義高階版python執行

基於簡單版建立類物件過多,現自定義高階版python執行緒池,程式碼如下 1 #高階執行緒池 2 import queue 3 import threading 4 import time 5 StopEvent = object() #全域性變數當作取任務時的停止標誌只要不

飲冰三年-人工智慧-Python-20 Python執行

程序:最小的資料單元 執行緒:最小的執行單元 一: 1:執行緒1 import threading #執行緒 import time def Music(): print("Listen Music Begin %s" %time.ctime()) time.sl

Python 執行和非同步

Python 執行緒和非同步 執行緒: cpu切換上下文 協程: 使用者切換上下文   Description: Example: io 處理 #!/usr/bin/env python # coding: utf-8

Python---執行的鎖

1、同步鎖 為了防止讀取到髒資料,對臨界資源進行加鎖,將並行被迫改為序列。通過threading.Lock()方法建立一把鎖。 acquire() 方法:只有一個執行緒能成功的獲取鎖,按先後順序 其他執行緒只能等待。release() 方法:執行緒釋放。這把鎖不允許在同一執行緒中被多次acq

執行有返回值

Runnable,該介面的run方法並無返回值。而Callable的call方法可以根據你傳入的泛型引數返回對應型別的資料。 public class TaskCallable implements Callable<String>{     private

2018-11-28親測有效的python執行終結,終止執行方法

import ctypes def _async_raise(tid, exctype): """raises the exception, performs cleanup if needed""" if not inspect.isclass(exctype):

Java多執行--執行等待子執行執行完畢

參考連結:https://www.cnblogs.com/eoss/p/5902939.html 使用Java多執行緒程式設計時經常遇到主執行緒需要等待子執行緒執行完成以後才能繼續執行,那麼接下來介紹一種簡單的方式使主執行緒等待。 java.util.concurrent.CountDown

python執行池(threadpool)模組使用筆記

https://www.cnblogs.com/xiaozi/p/6182990.html   一、安裝與簡介 pip install threadpool    pool = ThreadPool(poolsize) requests = make

2種辦法HashMap執行安全

HashMap不是執行緒安全的,往往在寫程式時需要通過一些方法來回避.其實JDK原生的提供了2種方法讓HashMap支援執行緒安全. 方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是執行緒安全的. 這

[python]執行GIL鎖

#gil global interpreter lock (cpython) #python中一個執行緒對應於c語言中的一個執行緒 #gil使得同一個時刻只有一個執行緒在一個cpu上執行位元組碼, 無法將多個執行緒對映到多個cpu上執行 #gil會根據執行的位