python queue join task_done的概念及实例解析

发布时间 2023-10-08 10:46:15作者: 虚生
一 概念
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作。
 
二 实例
源码一
import threading
import queue
import time

# 创建队列,用于存储数据
q = queue.Queue()
icnt = 0
def producer():
    while True:
        global icnt
        icnt = icnt + 1
        #print("producer icnt is:%d "%icnt)
        data = "hello world"
        print("producer is:",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        #q.join()
        data = "hello queue aaa "
        print("producer is:aaa ",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        q.join()
        time.sleep(1)

def consumer():
    while True:
        data = q.get() # 消费者线程,从队列取出数据
        q.task_done()
        print("consumer is:",data)


# 创建并启动生产者、消费者线程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()

# 等待线程结束

t1.join()
t2.join()

运行结果:

producer is: 1
producer is:aaa  1
consumer is: hello world
consumer is: hello queue aaa 
producer is: 2
producer is:aaa  2
consumer is: hello world
consumer is: hello queue aaa 

源码二

import threading
import queue
import time

# 创建队列,用于存储数据
q = queue.Queue()
icnt = 0
def producer():
    while True:
        global icnt
        icnt = icnt + 1
        #print("producer icnt is:%d "%icnt)
        data = "hello world"
        print("producer is:",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        q.join()
        data = "hello queue aaa "
        print("producer is:aaa ",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        q.join()
        time.sleep(1)

def consumer():
    while True:
        data = q.get() # 消费者线程,从队列取出数据
        q.task_done()
        print("consumer is:",data)


# 创建并启动生产者、消费者线程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()

# 等待线程结束

t1.join()
t2.join()

运行结果:

producer is: 1
consumer is: hello world
producer is:aaa  1
consumer is: hello queue aaa 
producer is: 2
consumer is: hello world
producer is:aaa  2
consumer is: hello queue aaa 

 

三 总结
看完例子,再回头看刚开始的那段话,会有豁然开朗的感觉。
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作。