一:线程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=Truetimeout=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的更多相关文章

  1. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  2. python网络编程--线程(锁,GIL锁,守护线程)

    1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观 ...

  3. python网络编程--线程event

    一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...

  4. python网络编程--线程锁(互斥锁Mutex)

    一:为什么需要线程锁 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? 很简单,假设你有A,B两 ...

  5. python网络编程--线程join和Daemon(守护进程)

    一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...

  6. python网络编程--线程使用threading

    一:线程使用 线程使用有两种方法,一种是直接使用,二是通过继承threading.Thread类使用 二:函数式使用 函数式:调用thread模块中的start_new_thread()函数来产生新线 ...

  7. python网络编程--线程GIL(全局解释器锁)

    一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...

  8. python网络编程--线程Semaphore(信号量)

    一:Semaphore(信号量) 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才 ...

  9. python网络编程--线程递归锁RLock

    一:死锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

随机推荐

  1. Java中的三目运算符可能出现的问题

    你真的了解Java中的三目运算符吗? 原创 2018-04-27 刨根问底的 Hollis Hollis Hollis 微信号 hollischuang 功能介绍 一个对Coding有着独特追求的人. ...

  2. 利用poi来向execl中写入对象

    附上jar包下载链接: 附上百度网盘下载连接: 链接:https://pan.baidu.com/s/1t_jXUq3CuhZo9j_UI4URAQ 密码:r2qi package com.wz.po ...

  3. Android中用GridView实现九宫格的两种方法(转)

    Android中用GridView实现九宫格的两种方法http://blog.csdn.net/shakespeare001/article/details/7768455 1.传统办法:实现一个继承 ...

  4. Html5 drag&drop

    下面是一个拖放例子 定义如下的两个div,分别是用于拖放后放置新元素的容器和可拖动的元素: <body> <div id="holder" style=" ...

  5. 【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    Description 给定一棵 \(n\) 个节点的树,每条边上有一个字符,字符集大小 \(22\),求每个节点的子树内最长的简单路径使得路径上的字符经过重排后构成回文串. Limitation \ ...

  6. MySQL 第二篇:库操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  7. Wannafly挑战赛21 C 大水题

    https://www.nowcoder.com/acm/contest/159/C dp #include <cstdio> #include <cstdlib> #incl ...

  8. shiro权限认证与授权

    什么是shiro? Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 为什么要用sh ...

  9. Spss22安装与破解步骤

    Spss22安装与破解教程 向师姐请教了一些学术问题,哈哈说的有点大,不过真的很感谢,学到了很多,少走了很多弯路. 1.下载安装包 可以去IBM官网.人大论坛等网站下载,全部文件应包括spss22安装 ...

  10. 企业级镜像管理系统Harbor

    Harbor简介 在说harbor之前,我们首先说一说直接使用docker registry的一些缺陷: 缺少认证机制,任何人都可以随意拉取及上传镜像,安全性缺失 缺乏镜像清理机制,镜像可以push却 ...