一. 前言
task_done()
是Python
中queue
模块提供的方法,用于通知队列管理器,已经处理完了队列中的一个项目。
queue.task_done()
是Queue
对象的一个方法,它用于通知Queue
对象,队列中的某一项已经被处理完毕。通常在使用Queue对象时,当生产者把数据放入队列中后,消费者需要从队列中取出数据并进行处理。当消费者处理完一项数据后,就可以使用queue.task_done()
方法通知队列,这样Queue
对象就可以知道队列中那一项已经被处理完毕了。
使用队列时,我们通常使用put()
方法将项目添加到队列中,然后使用get()方法从队列中获取项目进行处理。在处理完一个项目后,我们可以使用task_done()
方法通知队列管理器,这个项目已经被处理完了。
如果我们使用了join()
方法等待所有的项目都被处理完,那么这个方法会在所有的项目都被处理完后返回。
二. 基本使用
示例代码
import queue
import threading
def worker(q):
while True:
item = q.get()
print("Processing", item)
q.task_done()
if __name__ == '__main__':
q = queue.Queue()
for i in range(5):
q.put(i)
for i in range(3):
t = threading.Thread(target=worker, args=(q,))
t.daemon = True
t.start()
q.join()
print("All items processed.")
在上面的示例代码中,我们首先创建了一个队列q,并向其添加了5个项目。然后,我们创建了3个线程,每个线程使用worker()
函数从队列中获取一个项目,并使用task_done()
方法将其处理掉。由于我们使用了join()
方法等待所有的项目都被处理完,因此在所有的项目都被处理完后,最后输出"All items processed."。
运行结果:
在这个示例中,task_done()
方法每次从队列中取出一个项目就会被调用一次,因此,队列管理器最终会知道所有的项目都已经被处理完毕。
三. 任务实时完成通知使用
边读边取的示例代码:
这里定义了一个生产者和一个消费者,并使用Queue
对象用于数据传输。生产者往队列中放入了10个数据项,每个数据项之间暂停1秒,而消费者从队列中取出数据项并进行处理,每次取出一个数据项后暂停2秒。在消费者处理完每个数据项之后,使用q.task_done()
方法通知队列,以便队列可以知道已经有一项数据被处理完毕了。
import queue
import threading
import time
def producer(q):
for i in range(10):
q.put(i)
print("[Producer] Put item {} into queue".format(i))
time.sleep(1)
def consumer(q):
while True:
item = q.get()
print("[Consumer] Get item {} from queue".format(item))
q.task_done()
print(f'task {threading.current_thread().name} done! item-->:{item}')
time.sleep(2)
if __name__ == '__main__':
q = queue.Queue()
t1 = threading.Thread(target=producer, args=(q,))
t2 = threading.Thread(target=consumer, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
运行结果:
这里的代码使用了线程来模拟生产者和消费者,并且生产者和消费者都是边放数据边取数据,因此可以看到数据的生产和消费是交替进行的。
具体的使用需要更具不同的业务场景来选择使用的方式
以上就是Python - 队列【queue】task_done()和join()基本使用的介绍,感谢阅读,希望对你有所帮助!