Heim  >  Fragen und Antworten  >  Hauptteil

Python-Klassen, die Threads erben, können Threads nicht über Flag-Bits beenden

Ich bin beim Testen des Producer-Consumer-Modells auf ein solches Problem gestoßen. Nachdem ich den Thread geerbt habe, habe ich eine Markierung hinzugefügt

class Consumer(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self._queue = queue
        self.mark = True

    def run(self):
        while self.mark:
            msg = self._queue.get()
            if isinstance(msg, str) and msg == 'quit':
                break
            print("I'm a thread, and I received %s!!" % msg)

        print('Bye byes!')
def producer():
    q = queue.Queue()
    worker = Consumer(q)
    worker.start()  # 开启消费者线程
    start_time = time.time()
    while time.time() - start_time < 5:
        q.put('something at %s' % time.time())
        time.sleep(1)
    worker.mark = Flese
    worker.join()

Ich hatte ursprünglich erwartet, dieses Flag zu verwenden, um eine Thread-Endkontrolle zu erreichen, aber der tatsächliche Effekt ist, dass das Programm in worker.join() stecken bleibt und überhaupt nicht beendet wird.


Entschuldigung, was ist der Grund dafür?

黄舟黄舟2684 Tage vor765

Antworte allen(1)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-05-18 11:04:22

    class Consumer(threading.Thread):
        def __init__(self, queue):
            threading.Thread.__init__(self)
            self._queue = queue
            self.mark = True
    
        def run(self):
            while self.mark:
                try:
                    msg = self._queue.get(block=False) # 非阻塞
                    print("I'm a thread, and I received %s!!" % msg)
                except:pass
                
            print('self.mark',self.mark)
            print('Bye byes!')
            
    def producer():
        q = queue.Queue()
        worker = Consumer(q)
        worker.start()  # 开启消费者线程
        start_time = time.time()
        while time.time() - start_time < 5:
            q.put('something at %s' % time.time())
            time.sleep(1)
        worker.mark = False
        worker.join()

    Antwort
    0
  • StornierenAntwort