2009-06-12 39 views

Trả lời

13

Như đã đề cập, trình bao bọc quanh lớp Thread có thể bắt trạng thái đó. Đây là một ví dụ.

>>> 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

Bạn có thể đặt một số biến toàn cầu thành 0 nếu thành công hoặc khác 0 nếu có ngoại lệ. Đây là một quy ước khá chuẩn.

Tuy nhiên, bạn cần phải bảo vệ biến này bằng mutex hoặc semaphore. Hoặc bạn có thể chắc chắn rằng chỉ có một chủ đề sẽ bao giờ viết cho nó và tất cả những người khác sẽ chỉ đọc nó.

+0

0 để thành công có thể là một quy ước khá chuẩn, nhưng không phải là một boolean 'succeded' sẽ dễ dàng hơn một chút trên trình thông dịch thịt? –

+0

Nó không phải là toàn cầu nếu tôi phân lớp Thread, chỉ cần một biến thành viên trong đó để cho biết thành công. Tôi đã chỉ tự hỏi nếu có bất kỳ cách tích hợp để làm điều này, giống như mã thoát khỏi quá trình. –

+5

Chủ đề và trạng thái toàn cầu. Hai thị hiếu tuyệt vời tthat tate gsrat eogetherrrrrrrrrrrrrrrr Phân đoạn lỗi, lõi đổ. – Glyph

0

Để chức năng của chuỗi bắt ngoại lệ. (Bạn có thể thực hiện việc này bằng chức năng trình bao bọc đơn giản chỉ cần gọi hàm chuỗi cũ bên trong một số try ... except hoặc try ... except ... else khối). Sau đó, câu hỏi chỉ trở thành "làm thế nào để truyền thông tin từ một chủ đề khác", và tôi đoán bạn đã biết làm thế nào để làm điều đó.