Maison  >  Questions et réponses  >  le corps du texte

Les classes Python qui héritent des threads ne peuvent pas terminer les threads via des bits d'indicateur

J'ai rencontré un tel problème lors du test du modèle producteur-consommateur. Après avoir hérité du fil, j'ai ajouté une marque

.
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()

Je m'attendais à l'origine à utiliser cet indicateur pour obtenir le contrôle de fin de thread, mais l'effet réel est que le programme est bloqué dans worker.join()
et ne se termine pas du tout.

Excusez-moi, quelle en est la raison ?

黄舟黄舟2684 Il y a quelques jours767

répondre à tous(1)je répondrai

  • 伊谢尔伦

    伊谢尔伦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()

    répondre
    0
  • Annulerrépondre