2013-08-07 24 views
9

Chúng tôi bị ảnh hưởng bởi lỗi này:phát hiện Interpreter tắt trong daemon thread

http://bugs.python.org/issue1856 Daemon đề segfault trong thông dịch đóng cửa.

Bây giờ tôi tìm kiếm một cách để mã xung quanh lỗi này.

Tại thời điểm này mã trông như thế này:

while True: 
    do_something() 
    time.sleep(interval) 

Có cách nào để kiểm tra xem người phiên dịch là vẫn còn sử dụng trước khi do_something()?

Hoặc tốt hơn là không làm mythread.setDaemon (Đúng) và kiểm tra xem chuỗi chính đã thoát chưa?

+1

liên quan: http://stackoverflow.com/questions/16731115/how-to-debug-a-python-seg-fault – guettli

Trả lời

5

trả lời cho câu hỏi riêng:

tôi sử dụng mô hình này ngay bây giờ: không setDaemon (True), không sử dụng giấc ngủ(), sử dụng parent_thread.join()

while True: 
    parent_thread.join(interval) 
    if not parent_thread.is_alive(): 
     break 
    do_something() 

liên quan: http://docs.python.org/2/library/threading.html#threading.Thread.join

+0

Tôi không hiểu. Nếu một thread con không phải là daemon, thì một thread cha sẽ không bao giờ chết (trước khi con) và do đó 'is_alive' trên parent sẽ luôn luôn đúng. I E. toàn bộ kiểm tra này là vô nghĩa. Nó có thể làm việc nếu một chủ đề con là daemon mặc dù. – freakish

+1

@freakish nếu chuỗi gốc (chủ đề) đã kết thúc, is_alive() sẽ trả về False, nhưng chuỗi con vẫn còn sống. Nó hoạt động trong các bài kiểm tra của tôi. – guettli

+0

Thú vị. Tôi đã thử nghiệm nó và bạn nói đúng: nó hoạt động. – freakish

0

Đây là một mã từ threading.py mô-đun:

import sys as _sys 

class Thread(_Verbose): 
    def _bootstrap_inner(self): 
     # some code 

      # If sys.stderr is no more (most likely from interpreter 
      # shutdown) use self._stderr. Otherwise still use sys (as in 
      # _sys) in case sys.stderr was redefined since the creation of 
      # self. 
      if _sys: 
       _sys.stderr.write("Exception in thread %s:\n%s\n" % 
        (self.name, _format_exc())) 
      else: 
       # some code 

có thể hữu ích. Lỗi bạn thấy xuất phát từ câu hỏi else. Vì vậy, trong trường hợp của bạn:

import sys as _sys 

while True: 
    if not _sys: 
     break/return/die/whatever 
    do_something() 
    time.sleep(interval) 

Tôi không chắc chắn nếu nó hoạt động mặc dù (lưu ý rằng phiên dịch shutdown có thể xảy ra bên trong do_something vì vậy bạn có lẽ nên quấn tất cả mọi thứ với try:except:).

Chủ đề Daemon không nhất thiết là xấu, chúng chắc chắn có thể tăng tốc quá trình phát triển. Bạn chỉ cần cẩn thận với họ.

Các vấn đề liên quan