Как передать исключение между потоками в Python - PullRequest
7 голосов
/ 02 июня 2009

Мне нужно передать исключения через границу потока.

Я использую Python, встроенный в не поточно-ориентированное приложение, которое имеет один потоко-безопасный вызов post_event (callable), который вызывает callable из своего основного потока.

Я запускаю графический интерфейс pygtk в отдельном потоке, поэтому, когда нажимается кнопка, я публикую событие с post_event и жду его завершения, прежде чем продолжить. Но мне нужно, чтобы вызывающий узнал, вызвал ли вызываемый исключение, и поднял его, если так. Я не слишком беспокоюсь об отслеживании, только само исключение.

Мой код примерно:

class Callback():
    def __init__(self,func,*args):
        self.func=func
        self.args=args
        self.event=threading.Event()
        self.result=None
        self.exception=None
    def __call__(self):
        gtk.gdk.threads_enter()
        try:
            self.result=self.func(*self.args)
        except:
            #what do I do here? How do I store the exception?
            pass
        finally:
            gtk.gdk.threads_leave()
            self.event.set()
    def post(self):
        post_event(self)
        gtk.gdk.threads_leave()
        self.event.wait()
        gtk.gdk.threads_enter()
        if self.exception:
            raise self.exception
        return self.result

Любая помощь приветствуется, спасибо.

1 Ответ

13 голосов
/ 02 июня 2009

# что мне здесь делать? Как мне сохранить исключение?

Используйте sys.exc_info()[:2], см. эту вики

Лучший способ связи между потоками - Очередь . Пусть основной поток создаст экземпляр Queue.Queue и передаст его подпроцессам; когда у подпотока есть что-то для обратной связи с мастером, он использует .put в этой очереди (например, кортеж с идентификатором потока, типом исключения, значением исключения или другой полезной информацией, не обязательно связанной с исключением, просто убедитесь, что Первый элемент кортежа определяет тип информации ;-). Мастер может .get вернуть эти информационные блоки, когда захочет, с различными вариантами синхронизации и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...