队列Queue的get方法
写了一段生产者消费者模型的代码:
from time import sleep
from random import randint, random
from multiprocessing import Process, Queue def consumer(q, name):
while 1:
if q.get() == 'stop' and q.qsize() == 0:
break
food = q.get()
print('%s 吃了 %s' % (name, food))
sleep(randint(1, 3)) def producer(q, name, food):
for i in range(10):
sleep(random())
foo = food + str(i)
print("%s 拉了一坨 %s" % (name, foo))
q.put(foo) if __name__ == '__main__':
q = Queue(10)
c = Process(target=consumer, args=(q, "老狗"))
c.start()
p1 = Process(target=producer, args=(q, '峰哥', '粑粑'))
p1.start()
p1.join()
q.put('stop')
这段代码执行的结果是:
峰哥 拉了一坨 粑粑0
峰哥 拉了一坨 粑粑1
老狗 吃了 粑粑1
峰哥 拉了一坨 粑粑2
峰哥 拉了一坨 粑粑3
峰哥 拉了一坨 粑粑4
老狗 吃了 粑粑3
峰哥 拉了一坨 粑粑5
老狗 吃了 粑粑5
峰哥 拉了一坨 粑粑6
峰哥 拉了一坨 粑粑7
老狗 吃了 粑粑7
峰哥 拉了一坨 粑粑8
峰哥 拉了一坨 粑粑9
老狗 吃了 粑粑9
发现只打印了奇数的产品,排错发现是逻辑出错了,应该先用food先从队列里面get,然后去判断,而上面这段代码的问题出在每次if判断从队列里面拿出来了一个导致的
下面是修改后的代码:
from time import sleep
from random import randint, random
from multiprocessing import Process, Queue def consumer(q, name):
while 1:
food = q.get()
if food == 'stop':
break
print('%s 吃了 %s' % (name, food))
sleep(randint(1, 3)) def producer(q, name, food):
for i in range(10):
sleep(random())
foo = food + str(i)
print("%s 拉了一坨 %s" % (name, foo))
q.put(foo) if __name__ == '__main__':
q = Queue(10)
c = Process(target=consumer, args=(q, "老狗"))
c.start()
p1 = Process(target=producer, args=(q, '峰哥', '粑粑'))
p1.start()
p1.join()
q.put('stop')
队列Queue的get方法的更多相关文章
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- Java中的队列Queue,优先级队列PriorityQueue
队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...
- jquery 的队列queue
使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- (C#)使用队列(Queue)解决简单的并发问题
(C#)使用队列(Queue)解决简单的并发问题 2015-07-16 13:04 13265人阅读 评论(8) 收藏 举报 分类: Asp.Net(8) 版权声明:本文为博主原创文章,未经博主允 ...
- java09 队列Queue与Deque
队列Queue与Deque. Enumeration Hashtable与Hashtable子类Properties(资源配置文件) 引用类型(强.软.弱.虚)与WeakHashMap Identit ...
- 多线程利器---队列(queue)
列表是不安全的数据结构 import threading,time li=[1,2,3,4,5] def pri(): while li: a=li[-1] print(a) time.sleep(1 ...
- 队列Queue和栈
1.队列Queue是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式,只能从线性表的一段添加(offer)元素, 从另一段取出(poll)元素,队列遵循先进先出的原则. 2.J ...
- java-Enumeration,单向队列Queue及双向队列Deque等容器简单使用
1.Enumeration容器使用: package com.etc; import java.util.Enumeration; import java.util.Vector; /* Enumer ...
随机推荐
- cent os 安装mariaDB / mySQL 之后初始化的命令
#安装mysql mysql-server,默认安装的是开源的mariaDB和它的server,mariadb-server,安装源中可能有找不到的,就换个名字再找找 yum install -y ...
- OOP 面向对象 七大原则 (二)
OOP 面向对象 七大原则 (二) 上一篇写到了前四个原则,这一篇继续~~ 接口隔离:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 又是一句大白话~就是说接口尽量 ...
- ZOJ 3229 Shoot the Bullet
Shoot the Bullet Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origin ...
- Strtus配置Tomcat出现问题2
启动myeclipse的tomcat6.0有如下提示:The APR based Apache Tomcat Native library which allows optimal performan ...
- java 线程安全和不安全
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染.(Vector,HashTa ...
- [jQuery]文本框text变化事件
$("#key").live("keyup",function(){ })
- 解决VTune错误PMU resources currently being used by another profiling tool or process
错误信息: When I ran Hardware Event-based Sampling Analysis 0, it showed the ERROR: Collection failed Co ...
- NEFU 118
其实一道公式题: n!中素数i的幂为: [n/i]+[n/i^2]+[n/i^3]+[n/i^4]+...... #include <iostream> #include <cstd ...
- 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)
这一次我们深入的学习一下JavaScript面向对象技术,在学习之前,必要的说明一下一些面向对象的一些术语. 这也是全部面对对象语言所拥有的共同点.有这样几个面向对象术语: 对象 ECMA-262把对 ...
- C语言实现使用动态数组实现循环队列
我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...