1. 什么是队列?

  学过数据结构的人都知道,如果不知道队列,请Google(或百度)。

2. 在python中什么是多生产者,多消费模型?

  简单来说,就是一边生产(多个生产者),一边消费(多个消费者)。比如,一边有m个线程生产数据,另一边有n个线程消费(使用)数据,这就是多生产者,多消费者模型。

  注:消费依赖生产(没有厂家生产产品,就不会有关于这种产品的消费),在python中,如果生产者线程没有产生数据,那么消费者线程有关于消费行为的操作就应当处于阻塞状态。

3. 在python中为什么有queue这个标准模块?它有什么用?

  用threading.Lock Objects或其他的锁来完成上一问的需求会很复杂,所以queue这个模块简化了这些操作。

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

  queue模块实现了三类队列,主要差别在于取得数据的顺序上。在FIFO(First In First Out,先进先出)队列中,最早加入的任务会被最先得到。在LIFO(Last In First Out,后进先出)队列中,最后加入的任务会被最先得到(就像栈一样)。在优先队列中,任务被保持有序(使用heapq模块),拥有最小值的任务(优先级最高)被最先得到。

queue模块提供的方法:

 Queue.empty()
"""
如果队列为空,返回True,否则返回False。如果empty()返回True,它不保证后续调用put()不会阻塞。类似的,如果empty()返回False也不能保证接下来的get()调用不会被阻塞。
""" Queue.full()
"""
如果队列已满,则返回True,否则返回False。如果full()返回True,它不保证后续调用get()不会阻塞。类似的,如果full()返回False并不能保证接下来的put()调用不会被阻塞。
""" Queue.qsize()
"""
返回队列的近似大小。注意,qsize()> 0不保证随后的get()不会阻塞,qsize() < maxsize也不会保证put()不会被阻塞。
""" Queue.put(item, block=True, timeout=None)
"""
将item放入队列中。如果可选的参数block为True且timeout为None(默认的情况,阻塞调用,无超时),如有必要(比如队列满),阻塞调用线程,直到有空闲槽可用。如果超时是正数,则它最多阻塞超时秒,如果在该时间内没有空闲插槽,则引发Full异常。如果block为False,如果有空闲槽可用将数据放入队列,否则立即抛出Full异常(非阻塞调用,timeout被忽略)。
""" Queue.get(block=True, timeout=None)
"""
从队列中移除并返回一个数据。如果可选的参数block为True且timeout为None(默认的情况,阻塞调用,无超时),阻塞调用进程直到有数据可用。如果超时是正数,则它最多阻塞超时秒,如果在该时间内没有可用的项,则引发Empty异常。如果block为False,如果有数据可用返回数据,否则立即抛出Empty异常(非阻塞调用,timeout被忽略)。
""" Queue.put_nowait(item)
"""
等同于put(item, block=False)(非阻塞调用)。
""" Queue.get_nowait()
"""
等同于get(block=False)(非阻塞调用)。
""" Queue.task_done()
"""
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。 If a join() is currently blocking, it will resume when all items have been processed (meaning that a task_done() call was received for every item that had been put() into the queue). 如果该方法被调用的次数多于被放入队列中的任务的个数,ValueError异常会被抛出。
""" Queue.join()
"""
阻塞调用线程,直到队列中的所有任务被处理掉。 只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()以指示该项目已检索并且其上的所有工作都已完成时,计数将减少。当未完成的任务数降到0,join()解除阻塞。
"""

Queue对象(Queue、LifoQueue和PriorityQueue)提供了下述的公共方法

  注:由于同一进程的线程之间内存空间是共享的,故在同一进程的任一线程中定义的Queue对象,在该进程的任一线程都可以使用。

例(演示queue模块的使用):

 import queue,threading
import random,time class Producter(threading.Thread):
def __init__(self, name):
super(Producter, self).__init__()
self.name = "Producter:" + str(name) def run(self):
things = ['A', 'B', 'C']
for i in range(3):
production = random.choice(things)
print(self.name + " producted--->" + production)
production = production + " from " + self.name
all_productions.put(production) #将生产的数据放入队列
time.sleep(1)
time.sleep(5) class Consumer(threading.Thread):
def __init__(self, name):
super(Consumer, self).__init__()
self.name = "Consumer:" + str(name) def run(self):
for i in range(2):
thing = all_productions.get() #拿出已经生产好的数据
print(self.name + " is using--->" + thing)
time.sleep(2)
all_productions.task_done() #告诉队列有关这个数据的任务已经完成
time.sleep(5) if __name__ == "__main__":
all_productions = queue.Queue() #启动两个生产者线程生
p_s = []
for i in range(2):
p = Producter(i)
p.start()
p_s.append(p) #启动三个消费者线程消费
c_s = []
for i in range(3):
c = Consumer(i)
c.start()
c_s.append(c) #阻塞,直到生产者生产的数据被消耗完
all_productions.join()
#等待生产者线程结束
for p in p_s:
p.join()
#等待消费者线程结束
for c in c_s:
c.join()
print("finish....")

queue模块简单使用演示

python --- queue模块使用的更多相关文章

  1. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  2. Python——Queue模块以及生产消费者模型

    1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...

  3. Python之Queue模块

    Queue 1.创建一个“队列”对象 >>> import Queue >>> queue = Queue.Queue(maxsize=100) >>& ...

  4. Python -- queue队列模块

    一 简单使用 --内置模块哦 import Queuemyqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限. ...

  5. Python中Queue模块及多线程使用

    Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...

  6. python中的Queue模块

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...

  7. Python 单向队列Queue模块详解

    Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...

  8. Python Queue实现生产与消费

    Python Queue模块详解 from:https://blog.linuxeye.com/334.html Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块 ...

  9. Python3.5 queue模块详解

    queue介绍 queue是python中的标准库,俗称队列,可以直接import 引用,在python2.x中,模块名为Queue 在python中,多个线程之间的数据是共享的,多个线程进行数据交换 ...

随机推荐

  1. windows平台python 2.7环境编译安装zbarlight

    类似于前一篇博文,http://www.cnblogs.com/zhongtang/p/7148082.html中描述的情况. 编译zbarlight同样出现问题,简要处理步骤如下: 1.到https ...

  2. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  3. git学习四:eclipse使用git提交项目

    支持原创:http://blog.csdn.net/u014079773/article/details/51595127 准备工作: 目的:eclipse使用git提交本地项目,提交至远程githu ...

  4. JS——判断一个对象是否为空

    判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带 ...

  5. [学习OpenCV攻略][016][RedHat下安装OpenCV]

    安装环境 操作系统: Red Hat Enterprise Linux Server 6.3 相关软件: ffmpeg-0.8.15.tar.bz2.cmake-3.5.1.tar.gz.OpenCV ...

  6. Vue2反向代理

      前一段时间写了一个vue2的小项目,用的是vue-cli脚手架搭建的项目,项目里需要跨域,但又不能使用jsonp,上网查了一下,发现有一个之前没接触过的词语--反向代理. 什么是"反向代 ...

  7. 从零开始学习前端JAVASCRIPT — 6、JavaScript基础DOM

    1:DOM(Document  Object  Model)的概念和作用 document对象是DOM核心对象:对html中的内容,属性,样式进行操作. 节点树中节点之间的关系:父子,兄弟. 2:DO ...

  8. union 时只能查出一个表中的信息,另一个表只能查出字段

    原因:news表中title字段的编码,与brand表中的编码不一致导致 y

  9. QQ邮箱开启SMTP服务的步骤

    首先要确保你的QQ邮箱已经要开启超过一个月.对于新开启的邮箱,腾讯是不开放这些功能的. 方法/步骤 首先点QQ头像旁边的信封符号进入邮箱. 当然你也可以使用 mail.qq.com进邮箱 进入邮箱后点 ...

  10. 你知道织梦后台安装插件时为什么会出现这个Character postion 686, 'item'&n

    https://zhidao.baidu.com/question/589525064.html?qbl=relate_question_3&word=Tag Character postio ...