2012-09-18 14 views
5

Đôi khi tôi muốn một lớp được cập nhật liên tục bởi một chuỗi công nhân mà nó sinh ra khi nó được tạo ra. Về cơ bản như thế này:Trong python, có cách nào tạo ra các chuỗi chết khi không còn tham chiếu đến chúng nữa không?

class MyWidget: 
    def __init__(self): 
     self.blah = None 
     self.thread = MyThread(self) 
     self.thread.start() 

    def update(self, blah): 
     self.blah = blah 

class MyThread(threading.Thread): 
    def __init__(self, widget): 
     self.widget = widget 

    def run(self): 
     while True: 
      time.sleep(1) 
      blah = poll() 
      self.widget.update(blah) 

Tôi muốn có một cách an toàn để thiết kế này vì vậy mà tôi chắc chắn rằng thread chết khi MyWidget không còn cần thiết. Vấn đề với mã ở trên là MyWidget sẽ không bao giờ chết vì nó đang được giữ nguyên bởi số MyThread. Tôi có thể khắc phục điều đó bằng cách cung cấp MyThread một weakref.ref cho số MyWidget và ngắt vòng lặp khi tham chiếu bị chết nhưng tôi đã phạm sai lầm khi không thực hiện điều này trong quá khứ.

Điều tôi thực sự thích là các chủ đề thu gom rác cùng với mọi thứ khác. I E. Một chuỗi bị giết khi nó là đồ thị tham chiếu và đồ thị tham chiếu của sợi chính bị phân tách. Liệu có thể viết một con thú như vậy không? Họ đã tồn tại chưa?

Trả lời

1

Nếu bạn sửa đổi MyThread để cung cấp một phương pháp stop:

class MyThread(threading.Thread): 
    def __init__(self, widget): 
     self.widget = widget 
     self.is_running = False 
     super(MyThread, self).__init__() 

    def run(self): 
     self.is_running = True 
     while self.is_running: 
      time.sleep(1) 
      blah = poll() 
      self.widget.update(blah) 

    def stop(self): 
     self.is_running = False 

Nếu tại điểm mà bạn MyWidget dụ không còn cần thiết bạn có thể gọi widget.thread.stop(), điều này sẽ diệt các sợi và cho phép tất cả mọi thứ để có GC' d.

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