2009-06-12 5 views

Odpowiedz

13

Jak wspomniano, otoki wokół klasy wątków mogą przechwycić ten stan. Oto przykład.

>>> from threading import Thread 
>>> class MyThread(Thread): 
    def run(self): 
     try: 
      Thread.run(self) 
     except Exception as self.err: 
      pass # or raise 
     else: 
      self.err = None 


>>> mt = MyThread(target=divmod, args=(3, 2)) 
>>> mt.start() 
>>> mt.join() 
>>> mt.err 
>>> mt = MyThread(target=divmod, args=(3, 0)) 
>>> mt.start() 
>>> mt.join() 
>>> mt.err 
ZeroDivisionError('integer division or modulo by zero',) 
-1

Można ustawić niektóre zmienne globalne na 0, jeśli powodzenie, lub niezerowe, jeśli wystąpił wyjątek. To dość standardowa konwencja.

Należy jednak chronić tę zmienną za pomocą muteksu lub semafora. Możesz też upewnić się, że tylko jeden wątek kiedykolwiek napisze do niego, a wszyscy inni po prostu to przeczytają.

+0

0 Sukces może być dość standardową konwencją, ale czy "automat" nie byłby łatwiejszy w interpretacji mięsa? –

+0

Nie musi to być globalne, jeśli mam podklasę wątku, potrzebna jest tylko zmienna składowa, która wskazywałaby na sukces. Właśnie zastanawiałem się, czy jest jakiś wbudowany sposób, aby to zrobić, jak kod wyjścia procesu. –

+5

Wątki i stan globalny. Dwa świetne smaki tattat gsrat eogetherrrrrrrrrrrrrrrr Błąd segmentacji, rdzeń po cenach dumpingowych. – Glyph

0

Mieć wyjątki funkcji catch wyjątków. (Możesz to zrobić za pomocą prostej funkcji zwijania, która po prostu wywołuje funkcję starego wątku wewnątrz bloku try ... except lub . Wtedy pytanie staje się "jak przekazywać informacje z jednego wątku do drugiego" i wydaje mi się, że już wiesz, jak to zrobić.