大家好,《高效同步队列:实现多线程安全的数据交换》相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于《高效同步队列:实现多线程安全的数据交换》和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
队列模块实现了多生产者和消费者队列。在多线程编程中,当多个线程需要交换信息时,它特别有用!它内部还对需要的锁进行了实现。**队列模块实现多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。 **本模块中的Queue 类implements all the required locking semantics。这取决于Python中线程支持的可用性;请参阅线程模块。
队列有三种形式:先进先出、后进先出和优先队列。
实现三种类型的队列,其唯一的区别是检索条目的顺序。在FIFO 队列中,最先添加的任务将最先检索。在LIFO 队列中,最近添加的条目是第一个检索的条目(像堆栈一样操作)。使用优先级队列,条目保持排序(使用heapq 模块),并且首先检索价值最低的条目。
2 Queue模块中的主要类和异常处理
队列模块定义了以下类和异常:
2.1 class Queue.Queue(maxsize=0)
生成FIFO 队列。 maxsize是队列空间的上限。如果为空,则队列空间将是无限的。
FIFO 队列的构造函数。 maxsize 是一个整数,设置可以放入队列中的项目数的上限。一旦达到此大小,插入就会阻塞,直到队列项目被消耗。如果maxsize 小于或等于0,则队列大小是无限的。
2.2 class Queue.LifoQueue(maxsize=0)
生成LIFO 队列。其他与Queue.Queue相同。
LIFO 队列的构造函数。 maxsize 是一个整数,设置可以放入队列中的项目数的上限。一旦达到此大小,插入就会阻塞,直到队列项目被消耗。如果maxsize 小于或等于0,则队列大小是无限的。
2.3 class Queue.PriorityQueue(maxsize=0)
生成优先级优先队列。其他与Queue.Queue相同。
优先级队列的构造函数。 maxsize 是一个整数,设置可以放入队列中的项目数的上限。一旦达到此大小,插入就会阻塞,直到队列项目被消耗。如果maxsize 小于或等于0,则队列大小是无限的。
首先检索最低值的条目(最低值的条目是由sorted(list(entries))[0]返回的条目。条目的典型模式是: (priority_number, data) 形式的元组。
2.4 异常exception
** 异常Queue.Empty ** 读取空队列异常。
在空的Queue 对象上调用非阻塞get() (或get_nowait())时引发异常。
**异常Queue.Full ** 队列已满异常。
在已满的Queue 对象上调用非阻塞put() (或put_nowait())时引发异常。
3 Queue Objects
队列对象(Queue、LifoQueue 或PriorityQueue)提供下述公共方法。
队列.qsize()
返回队列的大致大小。请注意,qsize() 0 并不能保证后续的get() 不会阻塞,qsize() maxsize 也不能保证put() 不会阻塞。
队列.empty()
如果队列为空则返回True,否则返回False。如果empty()返回True,则不能保证对put()的后续调用不会阻塞。类似地,如果empty()返回False,则不能保证对put()的后续调用不会阻塞。对get() 的调用不会阻塞。
队列已满()
如果队列已满则返回True,否则返回False。如果full() 返回True,则不能保证后续对get() 的调用不会阻塞。类似地,如果full() 返回False,则不能保证后续对get() 的调用不会阻塞。对put() 的调用不会阻塞。
Queue.put(项目[, 块[, 超时]])
将项目放入队列中。如果可选参数块为true 并且超时为None(默认值),则根据需要进行阻止,直到有空闲槽可用。如果timeout 是正数,则它最多会阻塞timeout 秒,并且如果在该时间内没有可用的空闲槽,则会引发Full 异常。否则(block 为false),如果空闲槽立即可用,则将项目放入队列中,否则引发Full 异常(在这种情况下忽略超时)。
版本2.3: 中新增超时参数。
队列.put_nowait(项目)
相当于put(item, False)。
Queue.get([块[,超时]])
从队列中删除并返回一个项目。如果可选参数块为true 并且超时为None(默认值),则根据需要进行阻止,直到有项目可用。如果超时是正数,则它最多会阻止超时秒数,并且如果在该时间内没有可用的项目,则会引发空异常。否则(block 为false),如果一项立即可用,则返回一项,否则引发Empty 异常(在这种情况下超时将被忽略)。
版本2.3: 中新增超时参数。
Queue.get_nowait()
相当于get(False)。
提供了两种方法来支持跟踪排队任务是否已由守护进程消费者线程完全处理。
Queue.task_done()
指示先前排队的任务已完成。由队列消费者线程使用。对于用于获取任务的每个get(),随后对task_done() 的调用会告诉队列该任务的处理已完成。
如果join() 当前处于阻塞状态,它将在处理完所有项目后恢复(这意味着对于已put() 到队列中的每个项目都会收到一个task_done() 调用)。
如果调用次数多于队列中放置的项目数,则会引发ValueError。
2.5 版本中的新功能。
队列.join()
阻塞直到队列中的所有项目都被获取并处理。
每当将项目添加到队列中时,未完成任务的计数就会增加。每当消费者线程调用task_done()以指示该项目已被检索并且其上的所有工作都已完成时,计数就会减少。当未完成任务的计数降至零时, join() 解除阻塞。
2.5 版本中的新功能。
如何等待排队任务完成的示例:
def 工人():
而True:
项目=q.get()
做工作(项目)
q.task_done()
q=队列()
对于我在范围内(num_worker_threads):
t=线程(目标=工作者)
t.daemon=True
t.start()
对于源():中的项目
q.put(项目)
【《高效同步队列:实现多线程安全的数据交换》】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于找到一个同步队列的类!以后开发大型并发程序方便多了。
有11位网友表示赞同!
之前写多线程程序总遇到线程安全问题,这个队列可以帮着解决吗?
有18位网友表示赞同!
看名字就知道是用来处理多个线程同时访问的数据。挺实用的!
有10位网友表示赞同!
对队列的理解不太深,学习一下这家“queue”吧。
有12位网友表示赞同!
需要考虑并发情况下多线程竞争场景的需求,这个“queue”应该可以满足一些这样的特性。
有19位网友表示赞同!
同步机制如何实现呢?好奇想知道它的内部实现细节。
有5位网友表示赞同!
文档里会不会有使用示例?想要看看如何直接应用它到项目中。
有7位网友表示赞同!
之前用的是普通队列,现在有了这个“queue”,工作效率应该更高吧?
有13位网友表示赞同!
听起来很专业,我得认真看一下它的使用方法才行!
有16位网友表示赞同!
这种类型的类在哪些领域有实际的应用场景呢?
有16位网友表示赞同!
学习一下同步机制的好用工具!希望能提高我的编程水平。
有13位网友表示赞同!
期待这个队列可以支持各种不同的数据类型。
有20位网友表示赞同!
现在很多项目都涉及多线程并发编程,这个“queue”真是个贴心的解决方案!
有10位网友表示赞同!
需要弄明白“同步”具体的含义,才能更好地理解这个类。
有7位网友表示赞同!
不知道这个队列的性能如何?是否满足高吞吐量需求?
有19位网友表示赞同!
希望它可以支持多种插入和弹出操作的方式,方便使用。
有12位网友表示赞同!
看到标题我立马想到分布式场景下用的消息队列...
有6位网友表示赞同!
想了解更多关于“queue”类的相关知识。
有19位网友表示赞同!
这个类可以用在各个需要同步处理数据的环节吧?
有8位网友表示赞同!