python多线程编程-queue模块和生产者-消费者问题
摘录python核心编程
本例中演示生产者-消费者模型:商品或服务的生产者生产商品,然后将其放到类似队列的数据结构中。生产商品中的时间是不确定的,同样消费者消费商品的时间也是不确定的。
使用queue模块(python2.x版本中,叫Queue)来提供线程间通信的机制,从而让线程之间可以分享数据。具体而言,就是创建一个队列,让生产者(线程)在其中放入新的商品,而消费者(线程)消费这些商品。
下表是queue模块的部分属性:
| 属性 | 描述 |
| queue模块的类 | |
| Queue(maxsize=0) | 创建一个先入先出队列。如果给定最大值,则在队列没有空间时阻塞;否则,为无限队列 |
| LifoQueue(maxsize=0) | 创建一个后入先出队列。如果给定最大值,则在队列没有空间时阻塞;否则,为无限序列 |
| PriorityQueue(maxsize=0) | 创建一个优先级队列。如果给定最大值,则在队列没有空间时阻塞;否则,为无限序列 |
| queue异常 | |
| Empty | 当对空队列调用get*()方法时抛出异常 |
| Full | 当对已满的队列调用put*()方法时抛出异常 |
| queue对象方法 | |
| qsize() | 返回队列大小。(由于返回队列大小时可能被其他线程修改,所以该值为近似值) |
| empty() | 如果队列为空,则返回True,否则返回False |
| full() | 如果队列已满,则返回True,否则返回False |
| put(item,block=True,timeout=None) | 将item放入队列。如果block为True(默认值),且timeout为None,则在有可用空间之前阻塞;如果timeout为正值,最多阻塞timeout秒;如果block为False,则抛出Empty异常 |
| put_nowait(item) | 和put(item,False)效果相同 |
| get(block=True,timeout=None) | 从队列上取得元素。如果给定了block(非0),则一直阻塞直到有可用的元素为止 |
| get_nowait() | 和get(False)效果想用 |
| task_done() | 用于表示队列中的某个元素已执行完成,该方法会被下面的join()使用 |
| join() | 在队列中所有元素执行完毕并调用上面的task_done()信号前,保持阻塞。 |
下面的prodcons.py脚本中使用了queue对象实现了生产者-消费者场景,随机生产或消费商品,且生产者和消费者独立、并发的执行线程。注意,这里使用了在之前章节中改写的MyThread类。
#python 3.6
from random import randint
from time import sleep
from queue import Queue
from myThread import MyThread
#将一个对象放入队列中
def writeQ(queue):
print('正在为队列生产………')
queue.put('商品',1)
print('当前商品总数:',queue.qsize())
#消费队列中的一个对象
def readQ(queue):
val = queue.get(1)
print('正在从队列中消费商品……消费后还剩余商品:',queue.qsize())
#模仿生产者。
def writer(queue,loops):
for i in range(loops):
writeQ(queue)
sleep(randint(1,3))#writer的睡眠时间一般比reader短,是为了阻碍 reader从空队列中获取对象,换句话说就是使得轮到reader执行时,已存在可消费对象的可能性更大。
#模仿消费者
def reader(queue,loops):
for i in range(loops):
readQ(queue)
sleep(randint(2,5)) funcs = [writer,reader]
nfuncs = range(len(funcs)) def main():
nloops = randint(2,5)#randint 和randrange类似,区别在于,randrange是半开半闭区间,而randint是闭区间
q = Queue(32) threads = []#模拟线程池
for i in nfuncs:
t = MyThread(funcs[i],(q,nloops),funcs[i].__name__)#创建线程
threads.append(t) for i in nfuncs:
threads[i].start() #开始执行线程 for i in nfuncs:
threads[i].join() print('结束') if __name__ == '__main__':
main()
执行效果类似:
PS C:\Users\WC> python E:\Python3.6.3\workspace\prodcons.py
开始执行 writer 在: Thu Apr 19 21:06:22 2018
正在为队列生产………
开始执行 reader 在: Thu Apr 19 21:06:22 2018
当前商品总数: 1
正在从队列中消费商品……消费后还剩余商品: 0
正在为队列生产………
当前商品总数: 1
正在从队列中消费商品……消费后还剩余商品: 0
正在为队列生产………
当前商品总数: 1
正在从队列中消费商品……消费后还剩余商品: 0
正在为队列生产………
当前商品总数: 1
正在为队列生产………
当前商品总数: 2
writer 结束于: Thu Apr 19 21:06:30 2018
正在从队列中消费商品……消费后还剩余商品: 1
正在从队列中消费商品……消费后还剩余商品: 0
reader 结束于: Thu Apr 19 21:06:39 2018
结束
python多线程编程-queue模块和生产者-消费者问题的更多相关文章
- python 多线程笔记(5)-- 生产者/消费者模式
我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...
- python 多线程笔记(6)-- 生产者/消费者模式(续)
用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...
- Python多线程的简单实现(生产者消费者模型)
__author__ = "JentZhang" import time, threading, queue q = queue.Queue(maxsize=) # 声明队列 de ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- python多线程与threading模块
python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...
- Python并发编程-queue
Python并发编程-queue 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Queue # !/usr/bin/env python # _*_conding:utf-8_ ...
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- Python 单向队列Queue模块详解
Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...
随机推荐
- Elasticsearch系列---全面了解Document
概要 本篇主要介绍一下document的知识,对document的元数据和基本的语法进行讲解. document核心元数据 前面入门实战一节有简单介绍过document数据示例,这次我们来详细了解一下 ...
- 【Luogu P2471】[SCOI2007]降雨量
Luogu P2471 啊啊啊啊这真是一道史上最毒瘤的题目!!!!! 题意就是给出n个年份的降雨量 询问:"自从\(y\)年以来\(x\)年的降雨量最大"的正确性. 显然有多种情况 ...
- NLP 语义相似度计算 整理总结
更新中 最近更新时间: 2019-12-02 16:11:11 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学.写得不 ...
- Erlang/Elixir精选-第1期
第1期(20191202) 文章 A short guide to the structure and internals of the Erlang distributed messaging fa ...
- Eclipse中查看JAVA源代码显示SOURCE NOT FOUND解决办法
Problem:Java利用快捷键查看源代码显示Source not found 出现问题的原因:JDK目录下缺失src.zip文件只有javafx-src.zip src.zip文件:Java所有类 ...
- CentOS 7 Cobbler 自动化安装系统
在上一篇Cobbler 安装中,配置好了Cobbler,下面来配置自动化安装 配置cobbler-DHCP # 修改settings中参数,由cobbler控制dhcp [root@cobbler ~ ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- rsync工具、rsync常用选项、以及rsync通过ssh同步 使用介绍
第8周5月14日任务 课程内容: 10.28 rsync工具介绍10.29/10.30 rsync常用选项10.31 rsync通过ssh同步 10.28 rsync工具介绍 rsync是一个同步的工 ...
- 微信小程序setData复杂数组的更新、删除、添加、拼接
众所周知,微信小程序里所有对数据的修改只有在setData里修改才会在页面上渲染.在此分享小程序里复杂数组的更新.删除.添加.拼接 初始数据 数组嵌套对象 data: { cartList = [{ ...
- 八大机器学习框架对比及Tensorflow的优势
八大机器学习框架的对比: (1) TensorFlow:深度学习最流行的库之一,是谷歌在深刻总结了其 前身 DistBelief 的经验教训上形成的:它不仅便携.高效.可扩 展,还能再不同计算机上运 ...