python网络编程-线程队列queue
一:线程queu作用
Python中,queue是线程间最常用的交换数据的形式。
队列两个作用:一个是解耦,一个是提高效率
二:语法
1)队列的类
- class
queue.
Queue
(maxsize=0) #先入先出 - class
queue.
LifoQueue
(maxsize=0) #last in fisrt out - class
queue.
PriorityQueue
(maxsize=0) #存储数据时可设置优先级的队列
优先级队列的构造函数。maxsize可以放置在队列中的项的最大个数。
一旦达到这个大小,插入将阻塞,直到队列项被消耗。maxsize值为小于等于0,表示队列的大小是无限的。
2)队列两个异常
exception queue.
Empty 当调一个队列是空的,时候调用get()或者get_nowait()会抛出阻塞
exception queue.
Full
当调一个队列是最大值,时候调用put()或者put_nowait()会抛出非阻塞
3)队列的方法
Queue.
qsize
() 判断队列大小
Queue.
empty
() #空返回真
Queue.
full
() # 满反回真
Queue.
put
(item, block=True, timeout=None)- #给队列增加一个item。如果设置了block为true,并且timeout=None,表示一直阻塞,直到队列可以放item进去。
- 如果设置了timeout=为正值,表示最多阻塞多少秒,还是不能把item放进去,就会抛出
queue.
Full异常。
- 如果block为False,item不能放进去就抛出
queue.
Full。
-
Queue.
put_nowait
(item) ==Queue.
put
(item, block=False) -
Queue.
get
(block=True, timeout=None) - #从队列中删除并返回一个item。如果设置了block为true,并且timeout=None,表示一直阻塞,直到队列可以取item。
- 如果设置了timeout=为正值,表示最多阻塞多少秒,还是不能取到item,就会抛出
queue.Empty
异常。
- 如果block为False,不能取到item就抛出
queue.Empty
。
Queue.
get_nowait
() ==Queue.get
(False)
Queue.
task_done
()
Queue.task_done(),每次从queue中get一个数据之后,当处理好相关问题,最后调用该方法,以提示q.join()是否停止阻塞,让线程向前执行或者退出;
Queue.join(),阻塞,直到queue中的数据均被删除或者处理。为队列中的每一项都调用一次。
对于生产者-消费者模型,这样做还是有问题的,因为如果queue初始为空,q.join()会直接停止阻塞,继而执行后续语句;
如果有多个消费者,没有生产者,且queue始初化为一定的数据量,则可以正常执行。
三:生产者消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
四:代码
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import queue
import time
import threading q=queue.Queue() def producer(name): for i in range(10):
print("%s 生产了包子%s..." %(name,i))
q.put(i) #给队列增加一个item
time.sleep(1)
q.join()#阻塞,直到queue中的数据均被删除或者处理
print("包子都吃完了") def consumer(name): while True:
if q.qsize()>0:
print("%s 吃了包子%s....." %(name,q.get()))
q.task_done() ##告知这个任务执行完了
time.sleep(1) p=threading.Thread(target=producer,args=("qjj",))
c=threading.Thread(target=consumer,args=("lsj",))
p.start()
c.start() """
qjj 生产了包子0...
lsj 吃了包子0.....
qjj 生产了包子1...
lsj 吃了包子1.....
qjj 生产了包子2...
qjj 生产了包子3...
lsj 吃了包子2.....
qjj 生产了包子4...
lsj 吃了包子3.....
lsj 吃了包子4.....
qjj 生产了包子5...
lsj 吃了包子5.....
qjj 生产了包子6...
qjj 生产了包子7...
lsj 吃了包子6.....
qjj 生产了包子8...
lsj 吃了包子7.....
lsj 吃了包子8.....
qjj 生产了包子9...
lsj 吃了包子9.....
包子都吃完了
"""
python网络编程-线程队列queue的更多相关文章
- python网络编程--线程的方法,线程池
一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...
- python网络编程--线程(锁,GIL锁,守护线程)
1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观 ...
- python网络编程--线程event
一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...
- python网络编程--线程锁(互斥锁Mutex)
一:为什么需要线程锁 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? 很简单,假设你有A,B两 ...
- python网络编程--线程join和Daemon(守护进程)
一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...
- python网络编程--线程使用threading
一:线程使用 线程使用有两种方法,一种是直接使用,二是通过继承threading.Thread类使用 二:函数式使用 函数式:调用thread模块中的start_new_thread()函数来产生新线 ...
- python网络编程--线程GIL(全局解释器锁)
一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...
- python网络编程--线程Semaphore(信号量)
一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...
- python网络编程--线程递归锁RLock
一:死锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...
随机推荐
- NetApp存储方案及巡检命令
一.MCC概述 Clustered Metro Cluster(简称MCC)是Netapp Data Ontap提供的存储双活解决方案,当初的方案是把1个FAS/ V系列双控在数据中心之间拉远形成异地 ...
- Corosync+Pacemaker+crmsh构建Web高可用集群
一.概述: 1.1 AIS和OpenAIS简介 AIS应用接口规范,是用来定义应用程序接口(API)的开放性规范的集合,这些应用程序作为中间件为应用服务提供一种开放.高移植性的程序接口.是在实现高可用 ...
- 【poj2411】 Mondriaan's Dream
http://poj.org/problem?id=2411 (题目链接) 题意 一个$n*m$的网格,用$1*2$的方块填满有多少种方案. Solution 轮廓线dp板子.按格dp,对上方和左方的 ...
- 20165218 《网络对抗技术》Exp2 后门原理与实践
Exp2 后门原理与实践 准备工作 1. 查看Linux和Win的IP地址,ping通 Linux地址 Win7地址 ping 2.下载ncat并装载到win7主机 3.下载socat并装载到win7 ...
- Ntp服务器的搭建
在搭建Ntp服务器的过程中,试过两种方案,具体如下: 方案一: 到ntp官网获取源码编译,失败 下载源码ntp-4.2.8 -> ./configure -> make 无法通过: ...
- eos源码分析和应用(一)调试环境搭建
转载自 http://www.limerence2017.com/2018/09/02/eos1/#more eos基于区块链技术实现的开源引擎,开发人员可以基于该引擎开发DAPP(分布式应用).下面 ...
- egg.js路由的优雅改造
引言 在使用express,koa, 或者是egg.js进行node server开发的过程中,我们的路由基本上都是定义在controller层的,框架对于 node 原生路由都会进行一层封装,一版都 ...
- zkw费用流模板
理论:http://www.cnblogs.com/acha/p/6735037.html #include<cstdio> #include<cstring> #includ ...
- 为FreeBSD安装adobe flash插件
参考 FreeBSD官方手册浏览器一章. pkg install nspluginwrapper nspluginwrapper 是一个辅助安装配置 NetScape Plugin的工具. 可以为Ne ...
- java与Excel (.xls文件) ---使用JXL创建,增添表格文件
由于一些原因要搞一下excel文件,个人感觉poi太难,所以用了JXL(感觉比较简单). 1.添加外部归档 jxl.jar 2. /** 生成的xls文件第一次需要手动选择EXCEL打开* * */ ...