Python-Klassen, die Threads erben, können Threads nicht über Flag-Bits beenden
黄舟
黄舟 2017-05-18 11:02:22
0
1
833

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?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

Antworte allen(1)
伊谢尔伦
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()
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage