12.2、多线程通信:queue
queue:
- 什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。
- 线程之间的通信可以使用队列queue来进行
- 线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:
- 1.创建一个Queue对象:对象=queue.Queue(x),x是队列容量,x可以不填,默认没有容量限制,
- 2.get()可以使线程从队列中获取一个元素,如果队列为空,get会等待,get可以设置timeout参数,这是等待时间
- 3.put()可以往队列中放入一个元素【默认队列Queue是先入先出的,先放入的元素会先取出去】,如果队列满了,put会等待,put可以设置timeout参数,这是等待时间

【下例为:sender线程发送直径给recvder线程,recvder计算得出周长】
import threading,time,queue,random
def sender():#sender发送直径
while True:
x=random.randint(1,10)
print("send done:",x)
q.put(x)#每个一秒就放入一个随机数
time.sleep(1)#每隔一秒就放入一个a def recvder():#recvder计算周长
while True:
x=q.get()
print("recv done:",x*3.14)#每隔一秒就取出一个元素,计算结果
time.sleep(1) q=queue.Queue()
t1=threading.Thread(target=sender)
t2=threading.Thread(target=recvder) t1.start()
t2.start() t1.join()
t2.join()
- Queue 对象已经包含了必要的锁,所以不用担心会出错
import threading,time,queue,random
def sender():#sender发送直径
while True:
x=random.randint(1,10)
print("send done:",x)
q.put(x)#每个一秒就放入一个随机数
time.sleep(1)#每隔一秒就放入一个a def recvder():#recvder计算周长
while True:
x=q.get()
print(threading.current_thread(),"recv done:",x*3.14)#每隔一秒就取出一个元素,计算结果
time.sleep(2) q=queue.Queue()
t1=threading.Thread(target=sender)
t2=threading.Thread(target=recvder)
t3=threading.Thread(target=recvder) t1.start()
t2.start()
t3.start() t1.join()
t2.join()
t3.join()
注:
队列可以有容量限制:

timeout的设置:

队列的其他相关函数【设q为一个Queue对象】:
- q.qsize():返回当前队列的元素个数
- q.empty():判断队列是否空,返回布尔值
- q.full():判断队列是否满,返回布尔值
- q.get_nowait():直接使用get(),如果此时队列中没有元素,那么会阻塞等待,使用get_nowait()后,如果队列中没有元素,那么会报错
- q.put_nowait():直接使用put(),如果此时队列满了,那么会阻塞等待,使用put_nowait()后,如果队列已经满了,那么会报错
- q.task_done() :在完成一项工作之后,task_done()函数向任务已经完成的队列发送一个信号【功能类似于:有一个只能承重一个人的独木桥,A来了发现B在桥上,所以A不能上桥,他就在等,等到B过完桥后喊一下他,他才知道B过完桥了】【q.task_done主要是跟q.join()配合使用的】
- q.join():实际上意味着等到队列为空,再执行别的操作【每次get后需要调用task_done,直到所有队列为空,这时才会执行join下面的】
import threading,queue,time
"""
这个例子是:厂家跟司机约定,生产满3个,司机才来拉,
而一个个拉走,只有当3个都拉走,厂家才继续生产
"""
def producer():#厂家
while True:
for i in range(3):
q.put(i)
start_time=time.time()
q.join()##结果显示join这里堵塞住了厂家线程
print("wait time:",time.time()-start_time)#用来测试是否堵塞,证明不是因为司机的sleep堵塞运行 def driver():#老司机
while True:
for i in range(3):
print(q.get())
q.task_done()
print("")
time.sleep(2) q=queue.Queue()
t1=threading.Thread(target=producer)
t2=threading.Thread(target=driver) t1.start()
t2.start() t1.join()
t2.join()

queue中除了Queue之外,还有其他的队列,下面是常用的几个:
- Queue是先入先出的队列:

- LifoQueue则是后入先出的队列:

- PriorityQueue是由装入元素时指定的优先级来决定出元素的顺序的:
- 创建方法:队列对象=queue.PriorityQueue()
- 优先级是小的优先,但不能混合排序,str的只能跟str的一起排序,int的只能跟int一起排序
- PriorityQueue的put的参数是元组,格式为:队列对象.put((优先级, 数据))


- deque 是双端队列,允许先入先出和后入后出,即两端都可以出
- 由于双端队列实用性不大,实际上与列表没什么区别,在此不做阐述,大家可以参考:https://www.cnblogs.com/zhenwei66/p/6598996.html
12.2、多线程通信:queue的更多相关文章
- 8.并发编程--多线程通信-wait-notify-模拟Queue
并发编程--多线程通信-wait-notify-模拟Queue 1. BlockingQueue 顾名思义,首先是一个队列,其次支持阻塞的机制:阻塞放入和获取队列中的数据. 如何实现这样一个队列: 要 ...
- JAVA多线程通信
JAVA多线程通信 package com.frank.thread; /** * author:pengyan * date:Jun 16, 2011 * file:ProducerAndCusto ...
- python 守护进程、同步锁、信号量、事件、进程通信Queue
一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...
- 7.并发编程--多线程通信-wait-notify
并发编程--多线程通信-wait-notify 多线程通信:线程通信的目的是为了能够让线程之间相互发送信号; 1. 多线程通信: 线程通信的目的是为了能够让线程之间相互发送信号.另外,线程通信还能够使 ...
- Android多线程通信机制
掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...
- 转:windows下多线程通信方法
多线程知识简介 同一进程中可以包含多个线程,由于进程中的多个线程可以共享进程中的资源,所以使同一进程中的多个线程之间通信相对比较简单. 当需要有多个线程来访问一个全局变量时,通常我们会在这个全局变量前 ...
- python之多线程通信
共享变量通信 事实上共享变量通信是会造成线程安全的,除非我们对这个共享变量是有足够了解的,如非必要就不要使用共享变量在线程间进行通信 Queue通信 理解不深入,暂不写
- Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...
- 13.2、进程的通信:Queue、Pipe、
内容相关: 概念:进程的通信 Queue:创建与使用 Pipe:创建与使用 进程通信的概念 进程的资源空间是相互独立的,一般而言是不能相互访问的.但很多情况下进程间需要互相通信,来完成系统的某项功能. ...
随机推荐
- Ubuntu 13.10下安装ns2 2.35遇到的小问题
前面下载安装的环节我就不多说了,网上已经有很多的例子,最全的是一个新浪网友写的博客:http://blog.sina.com.cn/s/blog_785a23ae0100xraq.html.他使用的是 ...
- LDA-线性判别分析(四)其他几个相关问题
本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...
- CSS 基础:CSS 工作原理(2)<思维导图>
这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...
- SpringBoot全局配置文件
SpringBoot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到r ...
- TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()
Variable tensorflow中有两个关于variable的op,tf.Variable()与tf.get_variable()下面介绍这两个的区别 使用tf.Variable时,如果检测到命 ...
- 实现text-detection-ctpn一路的坎坎坷坷
小编在学习文字检测,因为作者提供的caffe实现没有训练代码(不过训练代码可以参考faster-rcnn的训练代码),所以我打算先使用tensorflow实现,主要是复现前辈的代码,主要是对文字检测模 ...
- Python和Java编程题(三)
1.题目:判断101到200之间有多少个素数,并输出所有素数 题目分析:判断一个数是否为素数,只需要判断这个数有没有除1和它自身外的其他因数.因此,判断这个数能否被2-它的平方根中的任意一个数整除即可 ...
- Mysql常用单词
Create 建造,创造Data数据Database数据库(缩写db)If如果Not没有Exists存在Table表Drop 去掉Delete删除Show展示Select选择Default默认Uniq ...
- windows下mysql-5.7.18安装
在官网下载了mysql压缩包,按照官网:https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html的教程安装,但是出错,后面根据 ...
- Oracle11g em启动报此网站的安全证书有问题的解决方案
http://blog.sina.com.cn/s/blog_a32eff280101cgje.html C:\>emctl status dbconsoleOracle Enterprise ...