Python2.7 Queue模块学习
前面了解了一下threading,发现一般都是和queue模块配合使用的,queue产生一个队列,队列模式有3种,针对这三种队列分别有三个构造函数:
1 FIFO队列先进先出:class Queue.Queue(maxsize)
2 LIFO类似于堆,即先进后出:class Queue.LifoQueue(maxsize)
3 优先级队列级别越低越先出来:class Queue.PriorityQueue(maxsize)
队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数, 默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block为1,get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。join()保持阻塞状态,直到处理了队列中的所有项目为止。在将一个项目添加到该队列时,未完成的任务的总数就会增加。当使用者线程调用task_done()以表示检索了该项目、并完成了所有的工作时,那么未完成的任务的总数就会减少。当未完成的任务的总数减少到零时,join() 就会结束阻塞状态。
队列实例分别有以下操作方法:
Queue.qsize() 返回队列的大小  
    Queue.empty() 如果队列为空,返回True,反之False  
    Queue.full() 如果队列满了,返回True,反之False 
    Queue.full 与 maxsize 大小对应  
    Queue.get([block[, timeout]]) 获取队列,timeout等待时间  
    Queue.get_nowait() 相当Queue.get(False) 
    Queue.put(item) 写入队列,timeout等待时间  
    Queue.put_nowait(item) 相当Queue.put(item, False) 
    Queue.task_done() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号 
    Queue.join() 实际上意味着等到队列为空,再执行别的操作
下面是一个生产者消费者模型,抄的改改代码就可以用了,主要是了解过程。
#!/usr/bin/python
import Queue
import time
import threading
q=Queue.Queue()
class producer(threading.Thread):
    def __init__(self,i):
        threading.Thread.__init__(self,name="producer Thread-%d" % i)
    def run(self):
        global q
        count=9
        while True:
            for i in range(3):
                if q.qsize() > 12:
                    pass
                else:
                    count=count+1
                    msg=str(count)
                    q.put(msg)
                    print self.name+' '+'producer'+msg+' '+'Queue Size:'+str(q.qsize())
            time.sleep(2)
class consumer(threading.Thread):
    def __init__(self,i):
        threading.Thread.__init__(self,name="consumer Thread-%d" % i)
    def run(self):
        global q
        while True:
            for i in range(3):
                if q.qsize() < 1:
                    pass
                else:
                    msg=q.get()
                    print self.name+' '+'consumer'+msg+' '+'Queue Size:'+str(q.qsize())
            time.sleep(2)
def test():
    for i in range(10):
        q.put(str(i))
        print 'Init producer  '+str(i)
    for i in range(2):
        p=producer(i)
        p.start()
    for i in range(3):
        c=consumer(i)
        c.start()
if __name__ == '__main__':
    test()测试图如下:

Python2.7 Queue模块学习的更多相关文章
- Python2.7 threading模块学习
		主要学习一下python的多线程编程,使用threading模块,threading 包括:Thread.conditions.event.rlock.semaphore等类. Thread对象可以实 ... 
- python3学习-Queue模块
		python标准库中带有一个Queue模块,顾名思义,队列.该模块也衍生出一些基本队列不具有的功能. 我们先看一下队列的方法: put 存数据 get 取数据 empty 判断队列是否为空 qsize ... 
- threading模块和queue模块实现程序并发功能和消息队列
		简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ... 
- Python3.5 queue模块详解
		queue介绍 queue是python中的标准库,俗称队列,可以直接import 引用,在python2.x中,模块名为Queue 在python中,多个线程之间的数据是共享的,多个线程进行数据交换 ... 
- Python之Queue模块
		Queue 1.创建一个“队列”对象 >>> import Queue >>> queue = Queue.Queue(maxsize=100) >>& ... 
- Python中Queue模块及多线程使用
		Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ... 
- (转)Python3.5 queue模块详解
		原文:https://www.cnblogs.com/CongZhang/p/5274486.html queue介绍 queue是python中的标准库,俗称队列,可以直接import 引用,在py ... 
- queue模块回顾
		queue queue是python中的标准库,俗称队列. 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时 ... 
- python中的Queue模块
		queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ... 
随机推荐
- 神秘数(bzoj 4408)
			Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ... 
- 一段曲折的copy路程
			cp 的时候出现:-bash: /bin/cp: Argument list too longcp ./*.swf /www/img/html/xxx/action/ 解决办法:find ./ -n ... 
- oc温习七:结构体与枚举
			结构体和枚举都是一种存储复杂的数据.结构体是用户自定义的一种类型,不同类型的集合. 1.结构体的创建及使用 定义结构体类型 struct MyDate { int year; int month; i ... 
- 设置select的默认选项
			2014-01-07 09:54:34| 通过后台传出的值进行选择默认项的设置 <select name="user_id" id="user_id" ... 
- POJ 2240 【这题貌似可以直接FLOYD    屌丝用SPFA通过枚举找正权值环   顺便学了下map】
			题意: 给了n种硬币的名称,给了m种硬币间的转换关系. 从任意兑换地点开始兑换,看是否能够通过兑换的方式增加金钱. 思路: 用SPFA不断对各个点进行松弛操作,寻找正权值的环.如果找到则输出Yes. ... 
- 寒武纪camp Day1
			补题进度:8/10 A(组合计数) 题意: 一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率. t,p<=100000 分析: 枚举不 ... 
- Java面试题总结(一)---Java基础
			Java面试题总结(一)---Java基础 1.面向对象的特征有哪些? 答:面向对象的特征主要有以下几个: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ... 
- vue2.0单元测试(一)
			1.在vue init webpack XXX创建项目的时候 最后2步选择YES就启动了vue单元测试开始了 2.测试是使用karma+mocha框架来实现的方法,安装虚拟浏览器模块Phantom ... 
- centOS 安装mysql5.6
			删除原先的mysql5.1#数据库服务器的安装 , 请自行在mysql官方找最新的rpm rpm -Uvh http://dev.mysql.com/get/mysql-community-relea ... 
- Openwrt 安装软件到U盘或硬盘
			http://blog.licess.org/openwrt-install-software-to-udisk-harddisk/ 运行一个多月的DDNAS被结婚来玩的小孩给关了,于是趁机更新了一下 ... 
