如何停止守护程序线程?

Let*_*zee 6 python multithreading python-multithreading python-3.x

我有一个简单的生产者消费者应用程

生产者是一个将东西写入队列的线程,而消费者是一个线程,它从队列中读取消息并在某些点退出.

我的制片人看起来有点像这样

def producer(queue):
    while not queue.full():
        queue.put(randint(1, 199))
Run Code Online (Sandbox Code Playgroud)

和消费者

def consumer(queue):
    for i in range(100):
        print(queue.get())
        queue.task_done()
Run Code Online (Sandbox Code Playgroud)

在我的主要部分,我调用那样的线程

p = Thread(target=producer)
c = Thread(target=consumer)

p.daemon = True
p.start()
c.start()
c.join()
Run Code Online (Sandbox Code Playgroud)

c完成唯一剩下的非deamon线程是main时,结束这些线程的正确方法是什么?

更新

这是我的生产者正在使用的确切代码,因为消费者正在退出,问题在于生产者

def generate_random_alphanumerics(msg_queue):
    while True:
        if not msg_queue.full():
            msg_queue.put(hashlib.sha1(bytes(randint(1, 10000))).hexdigest() * 10)
        else:
            sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

是线程正在睡觉的问题?

enr*_*cis 15

问题是生产者循环永远不会结束,所以你应该有办法告诉它停止.

stop_event= threading.Event()
p = Thread(target=producer, args=(msg_queue, stop_event))
p.start()
Run Code Online (Sandbox Code Playgroud)

制片人变成:

def generate_random_alphanumerics(msg_queue, stop_event):
    while not stop_event.is_set():
        if not msg_queue.full():
            [...]
Run Code Online (Sandbox Code Playgroud)

然后,当你想要停止生产者时,只需:

stop_event.set()
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,我一定是盲目的,或者在任何地方都没有以如此简单的术语提到这一点 (2认同)