内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Python Queue队列

2019-01-25 20:01 出处:清屏网 人气: 评论(0

Queue 模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用, 实现了所有必需的锁定语义。

一、该模块实现了三种类型的队列,它们的区别仅在于检索条目的顺序:

1、FIFO   队列,其添加的第一个任务是第一个检索的任务。

2、LIFO   队列,其最近添加的条目是第一个检索的(像堆栈一样运行)。

3、Priority   队列,其条目将保持排序,并首先检索最低值的条目。

二、该模块定义了以下类和异常:

FIFO队列的构造函数。  maxsize 是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果  maxsize 小于或等于零,则队列大小为无限大。

class   Queue. Queue maxsize = 0 

LIFO队列的构造函数。  maxsize 是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果  maxsize 小于或等于零,则队列大小为无限大。

class    Queue. LifoQueue maxsize = 0 

Priority队列的构造函数。  maxsize 是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果  maxsize 小于或等于零,则队列大小为无限大。

class     Queue. PriorityQueue maxsize = 0 

在queue对象为空时调用非阻塞  get() 或  get_nowait() 时引发异常。

exception   Queue. Empty

在queue对象已满时调用非阻塞  put() 或  put_nowait() 时引发异常。

  exception  Queue. Full

三、queue对象提供下面描述的公共方法:

Queue. qsize ()

返回队列 的大致大小(非准确值)。

Queue. empty ()

如果队列为空则返回True,否则返回False(仅限当前,不保证后续情况)。

Queue. full ()

如果队列已满则返回True,否则返回False(仅限当前,不保证后续情况)。

Queue . put (item [,block [,timeout ] ] )

将item放入队列。如果可选参数block为true 且 timeout为None,则在必要时阻止,直到有空闲槽可用。如果 timeout是一个正数,它会阻止最大超时时间,如果在该时间内没有可用的空闲槽,则会引发Full异常。

反之(block为false),如果有空闲槽可以立即使用,则将item放入队列,否则引发Full异常(在这种情况下忽略超时)。

Queue. put_nowait (item)

相当于  put( item, False )。

Queue. get ([ block [,timeout ] ] )

从队列中删除并返回一个item。 如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。 如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Empty异常。

反之(block为false),如果有item可以立即使用,则返回该tem,否则引发Empty异常(在这种情况下忽略超时)。

Queue. get_nowait()

相当于  get( False )。

四、queue对象还提供了两种方法来支持跟踪守护进程、消费者线程是否已完全处理入队任务:

表示之前队列的任务已完成。 由队列消费者线程使用。对于用于获取任务的每个get(),对task_done()的后续调用会告知队列该任务的处理已完成。

如果join() 当前正阻塞,则它将在所有条目都已处理后恢复(这意味着已为每个已放入队列的条目收到task_done()调用)。

如果调用的次数超过队列中放置的条目,则引发ValueError。

  Queue. task_done

阻止直到队列中的所有条目都已获取并处理完毕。

每当条目添加到队列时,未完成任务的计数就会增加。每当消费者线程调用 task_done() 以指示该条目已被检索并且其上的所有工作都已完成时,计数就会下降。当未完成任务的数量降至零时, join() 取消阻止。

  Queue. join

如何等待队列任务完成的示例:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done
分享给小伙伴们:
本文标签: PythonQueue队列

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号