捕获main在其他线程python中引发的异常

时间:2019-08-27 11:05:31

标签: python multithreading exception raspberry-pi

我试图在不直接引用线程的情况下结束线程执行。因为不可能在完整程序中执行此操作。 作为参考,主要程序是Raspberry Pi的,一旦按下按钮,我就需要它立即停止执行功能/线程。

我尝试从main引发异常,但是另一个由于某种原因没有捕获到它。

这是我一直在测试的报废程序:

import threading
import time

class Thread_Exception(Exception):
    def __init__(self, msg):
        return super().__init__(msg)


def thread_function(index):
    bool = True
    try:
        while bool:
            print("Print from thread #", index)
            time.sleep(4)
    except Thread_Exception:
        print('Exception thrown, thread #', index)
        bool = False

if __name__ == "__main__":
    try:
        for index in range(3):
            x = threading.Thread(target=thread_function, args=(index,))
            x.start()

        time.sleep(20)
        raise Thread_Exception("intr")

        while True:
            continue

    except KeyboardInterrupt:
        print('Interrupted main')

1 个答案:

答案 0 :(得分:1)

如何完成此操作的示例:

import threading 
import ctypes 
import time 

class thread_with_exception(threading.Thread): 
    def __init__(self, name): 
        threading.Thread.__init__(self) 
        self.name = name 

    def run(self): 

        # target function of the thread class 
        try: 
            while True: 
                print('running ' + self.name) 
        finally: 
            print('ended') 

    def get_id(self): 

        # returns id of the respective thread 
        if hasattr(self, '_thread_id'): 
            return self._thread_id 
        for id, thread in threading._active.items(): 
            if thread is self: 
                return id

    def raise_exception(self): 
        thread_id = self.get_id() 
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 
            ctypes.py_object(SystemExit)) 
        if res > 1: 
            ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0) 
            print('Exception raise failure') 

t1 = thread_with_exception('Thread 1') 
t1.start() 
time.sleep(2) 
t1.raise_exception() 
t1.join() 

此文章的来源目前可以在这里找到:

https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/