【python】同步队列模块queue

同步队列模块queue

queue 模块实现了多生产者、多消费者队列。这特别适用于消息必须安全地在多线程间交换的线程编程。模块中的 Queue 类实现了所有所需的锁定语义。

函数 作用
Queue.qsize() 返回队列的大致大小。注意,qsize() > 0 不保证后续的 get() 不被阻塞,qsize() < maxsize 也不保证 put() 不被阻塞。
Queue.empty() 如果队列为空,返回 True ,否则返回 False 。如果 empty() 返回 True ,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回 False ,也不保证后续调用的 get() 不被阻塞。
Queue.full() 如果队列是满的返回 True ,否则返回 False 。如果 full() 返回 True 不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回 False 也不保证后续调用的 put() 不被阻塞。
Queue.put(item, block=True, timeout=None) Put item into the queue. If optional args block is true and timeout is None (the default), block if necessary until a free slot is available. If timeout is a positive number, it blocks at most timeout seconds and raises the Full exception if no free slot was available within that time. Otherwise (block is false), put an item on the queue if a free slot is immediately available, else raise the Full exception (timeout is ignored in that case).
Queue.put_nowait(item) Queue.put_nowait(item)
Queue.get(block=True, timeout=None) 从队列中移除并返回一个项目。如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。
Queue.get_nowait() 相当于 get(False) 。
Queue.task_done()
  • 表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。
  • 如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。
  • 如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。
Queue.join() 阻塞至队列中所有的元素都被接收和处理完毕。

 

queue.put(None) 是 Python 中 Queue 模块中的方法之一,其作用是将 None 对象放入队列中。在多线程编程中,队列经常被用来作为不同线程之间通信的工具,put() 方法可以向队列中添加元素,而 get() 方法可以从队列中获取元素。在某些情况下,我们可能需要向队列中添加一个空对象(如 None),以便其他线程能够知道某个条件已经满足并开始执行相应的操作。

1. 例子:

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)
        # 处理队列中的元素

q = queue.Queue()
t = threading.Thread(target=worker, args=(q,))
t.start()

# 向队列中添加元素
q.put('Task 1')
q.put('Task 2')

# 通知另一个线程退出循环
q.put(None)

# 等待其他线程结束
t.join()

输出:

Task 1
Task 2

在上面的例子中,我们创建了一个 worker 线程,并向队列中添加了两个任务。当我们完成所有任务后,我们向队列中添加了一个 None 对象,以通知 worker 线程退出循环并结束运行。

 

参考资料

1. queue --- 一个同步的队列类

SimpleQueue 对象

函数 作用
SimpleQueue.qsize() 返回队列的大致大小。注意,qsize() > 0 不保证后续的 get() 不被阻塞。
SimpleQueue.empty() Return True if the queue is empty, False otherwise. If empty() returns False it doesn't guarantee that a subsequent call to get() will not block.
SimpleQueue.put(item, block=True, timeout=None) 将 item 放入队列。此方法永不阻塞,始终成功(除了潜在的低级错误,例如内存分配失败)。可选参数 block 和 timeout 仅仅是为了保持 Queue.put() 的兼容性而提供,其值被忽略。
SimpleQueue.put_nowait(item) 相当于 put(item, block=False),为保持与 Queue.put_nowait() 的兼容性而提供。
SimpleQueue.get(block=True, timeout=None) 从队列中移除并返回一个项目。如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。
SimpleQueue.get_nowait() 相当于 get(False) 。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2023-06-07 19:45  苏格拉底的落泪  阅读(75)  评论(0编辑  收藏  举报