九周一次课(12月18日) 16.3 queue模块(上) 16.4 queue模块(下)
来源:互联网 发布:淘宝服务器 编辑:程序博客网 时间:2024/05/24 00:04
九周一次课(12月18日)
16.3-16.4 queue模块
Python提供了Queue模块来专门实现消息队列Queue对象
Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。主要有以下成员函数:
Queue.qsize():返回消息队列的当前空间。返回的值不一定可靠。Queue.empty():判断消息队列是否为空,返回True或False。同样不可靠。Queue.full():类似上边,判断消息队列是否满Queue.put(item, block=True, timeout=None):往消息队列中存放消息。block可以控制是否阻塞,timeout指定阻塞时候的等待时间。如果不阻塞或者超时,会引起一个full exception。Queue.put_nowait(item):相当于put(item, False).Queue.get(block=True, timeout=None):获取一个消息,其他同put
以下两个函数用来判断消息对应的任务是否完成。
Queue.task_done():接受消息的线程通过调用这个函数来说明消息对应的任务已完成。Queue.join(): 实际上意味着等到队列为空,再执行别的操作
示例
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Author: lingxiangxiangimport random,threading,timefrom Queue import Queue#Producer threadclass Producer(threading.Thread): def __init__(self, t_name, queue): threading.Thread.__init__(self,name=t_name) self.data=queue def run(self): for i in range(10): #随机产生10个数字 ,可以修改为任意大小 # randomnum=random.randint(1,99) print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), i) self.data.put(i) #将数据依次存入队列 # time.sleep(1) print "%s: %s finished!" %(time.ctime(), self.getName())#Consumer threadclass Consumer_even(threading.Thread): def __init__(self,t_name,queue): threading.Thread.__init__(self,name=t_name) self.data=queue def run(self): while 1: try: val_even = self.data.get(1,5) #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超时5秒 if val_even%2==0: print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even) time.sleep(2) else: self.data.put(val_even) time.sleep(2) except: #等待输入,超过5秒 就报异常 print "%s: %s finished!" %(time.ctime(),self.getName()) breakclass Consumer_odd(threading.Thread): def __init__(self,t_name,queue): threading.Thread.__init__(self, name=t_name) self.data=queue def run(self): while 1: try: val_odd = self.data.get(1,5) if val_odd%2!=0: print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd) time.sleep(2) else: self.data.put(val_odd) time.sleep(2) except: print "%s: %s finished!" % (time.ctime(), self.getName()) break#Main threaddef main(): queue = Queue() producer = Producer('Pro.', queue) consumer_even = Consumer_even('Con_even.', queue) consumer_odd = Consumer_odd('Con_odd.',queue) producer.start() consumer_even.start() consumer_odd.start() producer.join() consumer_even.join() consumer_odd.join() print 'All threads terminate!'if __name__ == '__main__':main()
阅读全文
0 0
- 九周一次课(12月18日) 16.3 queue模块(上) 16.4 queue模块(下)
- 五周一次课(11月13日) 10.8.1 json(上) 10.8.2 json(下)
- 二周一次课(10月23日)
- 三周一次课(10月30日)
- Queue模块
- queue模块
- python模块学习(queue模块的Queue类、PriorityQueue类和LifoQueue类)
- 八周一次课(12月11日) 14.4 多进程锁 14.5 多进程共享内存
- Python多线程(3)——Queue模块
- python学习—Day46—Queue模块(一)
- 七周一次课(11月27日) 13.5 字符串操作 13.6 list操作 13.7 set操作
- 九周二次课(12月19日) 17.1 celery简介 17.2 celery小例子
- python Queue模块
- python Queue模块
- python Queue模块
- [Python] python Queue模块
- python Queue模块
- python Queue模块
- Linux禁止root登录
- expect实现rsync免密码传输
- vueJs图表组件
- flex TabNavigator 切换之前给出提示
- Failed to read artifcate descriptor for javax.servlet:jstl:jar:1.2
- 九周一次课(12月18日) 16.3 queue模块(上) 16.4 queue模块(下)
- Hello world!
- Spring学习,AOP增强类型
- 【Jedis】JedisCommand接口说明
- 充分利用机器学习的十一个开源工具
- 线程精进指南之线程池进阶
- 内核中的竞争状态和互斥(简述)
- 前端笔试题的小结(1)
- 关于error:Cannot assign to 'self' outside of a method in the init family