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
一:死锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...
随机推荐
- Linux内核分析实验三----跟踪分析Linux内核的启动过程
一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_ker ...
- 单点登录(九)-----遇到问题-----FileNotFoundException: class path resource-UsernamePasswordWrapperAuthenticatio
运行cas server 项目时 报错 FileNotFoundException: class path resource-UsernamePasswordWrapperAuthenticatio ...
- Android自定义 Dialog 对话框
Android自定义Dialoghttp://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html Android使用自定义AlertDialo ...
- Ntp服务器的搭建
在搭建Ntp服务器的过程中,试过两种方案,具体如下: 方案一: 到ntp官网获取源码编译,失败 下载源码ntp-4.2.8 -> ./configure -> make 无法通过: ...
- 拥抱Service Fabric —— 目录
理解分布式 经典分布式系统设计 云时代分布式系统演进 Service Fabric基础概念 Node, Application, Service, Partition/Replicas Partiti ...
- Java获取精确到毫秒的时间戳
import java.util.Date; public class Timestamp { /** 获取精确到毫秒的时间戳 * @param date * @return **/ public s ...
- 【学习DIV+CSS】1. 你必须知道的三个知识
1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...
- HttpContext.Current為空匯總
1. async異步模式下為空 解决办法: <httpRuntime targetFramework="4.5" /> 或者: In your appSettings, ...
- python 分布式进程体验
抽了点时间体验了一把python 分布式进程,有点像分布式计算的意思,不过我现在还没有这个需求,先把简单体验的脚本发出来,供路过的各位高手指教 注:需要先下载multiprocessing 的pyth ...
- 阿里云的OCS缓存机制
OCS简介 OCS( Open Cache Service)为分布式高速缓存服务,主要实现热点数据的快速响应: OCS支持Key/Value的数据结构,兼容memcachebinary protoco ...