一、队列queue

队列queue 多应用在多线程场景,多线程访问共享变量。

对于多线程而言,访问共享变量时,队列queue的线程安全的。

因为queue使用了一个线程锁(pthread.Lock()),以及三个条件变量(pthread.condition()),来保证了线程安全。

总结:队列提供了一个安全可靠的共享数据使用方案。队列内置控制安全的几个参数,非用户使用名称作用

self.mutex互斥锁任何获取队列的状态(empty(),qsize()等),或者修改队列的内容的操作(get,put等)都必须持有该互斥锁。共有两种操作require获取锁,release释放锁。同时该互斥锁被三个共享变量同时享有,即操作conditiond时的require和release操作也就是操作了该互斥锁。

self.not_full条件变量

队列没满当队列中有元素添加后,会通知notify其他等待添加元素的线程,唤醒等待require互斥锁,或者有线程从队列中取出一个元素后,通知其它线程唤醒以等待require互斥锁。

self.not_empty条件变量

队列不为空线程添加数据到队列中后,会调用self.not_empty.notify()通知其它线程,唤醒等待require互斥锁后,读取队列。

self.all_tasks_done条件变量

队列数据全部处理完消费者线程从队列中get到任务后,任务处理完成,当所有的队列中的任务处理完成后,会使调用queue.join()的线程返回,表示队列中任务以处理完毕。###queue的初始化函数###

def __init__(self, maxsize=0):

self.maxsize = maxsize

self._init(maxsize)

# mutex must be held whenever the queue is mutating.  All methods

# that acquire mutex must release it before returning.  mutex

# is shared between the three conditions, so acquiring and

# releasing the conditions also acquires and releases mutex.

self.mutex = _threading.Lock()

# Notify not_empty whenever an item is added to the queue; a

# thread waiting to get is notified then.

self.not_empty = _threading.Condition(self.mutex)

# Notify not_full whenever an item is removed from the queue;

# a thread waiting to put is notified then.

self.not_full = _threading.Condition(self.mutex)

# Notify all_tasks_done whenever the number of unfinished tasks

# drops to zero; thread waiting to join() is notified to resume

self.all_tasks_done = _threading.Condition(self.mutex)

self.unfinished_tasks = 0

二、队列数据存取规则:数据使用方式类名作用示例

FIFO先进先出Queue(maxsize)先进入队列的数据,先取出

maxsize:>=0

设置队列长度,0为无限长q = queue.Queue()

FILO先进后出LifoQueue(maxsize)先进入队列的数据,最后取出

maxsize:>=0

设置队列长度,0为无限长q = queue.LifoQueue()

Priority优先级PriorityQueue(maxsize)设置优先标志,优先取出高标志位

maxsize:>=0

设置队列长度,0为无限长q = queue.PriorityQueue()

###例子一:先进先出###

import queue

q = queue.Queue()

for i in range(5):

q.put(i)

for i in range(5):

print(q.get(),end=" ")

#---结果---

0 1 2 3 4

###例子二:后进先出###

import queue

q = queue.LifoQueue()

for i in range(5):

q.put(i)

for i in range(5):

print(q.get(),end=" ")

#---结果---

4 3 2 1 0

###例子三:按优先标志位读取###

#参考其它资料,看到许多讲述优先级队列的实现,但是我觉得直接用元组的方式比较简单粗暴。

import queue

p = queue.PriorityQueue()

p.put((3,"3"))

p.put((1,"1"))

p.put((4,"4"))

p.put((2,"2"))

for i in range(3):

print(p.get())

#---结果:按元组索引0排序---

(1, '1')

(2, '2')

(3, '3')

(4, '4')

###例子四:多元组判断###

import queue

p = queue.PriorityQueue()

p.put((1,4,"a"))

p.put((2,1,"666"))

p.put((1,3,"4"))

p.put((2,2,"2"))

for i in range(3):

print(p.get())

#-----结果:元组对应的序号进行比较,主键是序号0,越往后,优先度越低。-----

(1, 3, '4')

(1, 4, 'a')

(2, 1, '666')

(2, 2, '2')

三、队列的常用方法和属性:

方法和属性作用示例

task_done()1、标记之前的一个任务已经完成。

2、由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

3、如果当前的join()当前处于阻塞状态,当前的所有元素执行后都会重启(意味着收到加入queue的每一个对象的task_done()调用的信息)

join()阻塞:

等待队列所有任务执行结束。

当消费者线程调用task_done(),队列中未完成的计数就会减少,直至计数为0,解除阻塞。

put(item,block,timeout)把对象item放入队列:

item:对象名称,必填项。

block:

默认是True,如果队列满等待。

设置成False,如果队列满报Full异常。

timeout:【block为True是生效】

默认是None,如果队列满了等待。

0:不等待,队列满了立即报Full。

正数1~:等待相应秒数,秒数到了,队列还是满的,报错Full。

put_nowait(item)向队列里存对象,不等待,如果队列满了,报queue.Full错误

get(block,timeout)从队列取出对象,并把对象从队列中删除

block:

默认是True,队列为空等待。

可以变更为False,如果队列为空,报Empty错误。

timeout:【block为True是生效】

默认是None,队列为空,等待。

0:不等待,队列为空直接报Empty。

正数1~:等待相应秒数,如果依然为空,则报Empty

get_nowait()从队列里取对象,不等待,如果队列为空,报queue.Empty错误

qsize()返回队列长度的近似值。

qsize长度不做为get和put方法的操作依据。

empty()队列为空返回True

不做为get和put方法的操作依据。

full()队列满了返回True

不做为get和put方法的操作依据。

四、队列数据进出规则实例 :

也是一个最简单的生产者消费者例子。

'''例子一:队列基本的进出规则'''

import queue,time,threading,random

def productor(name,s):                        # 生产者函数,向队列里放产品

time.sleep(s)

print ('服务员{}有时间了'.format(name))

q.put(name)

def customer():                               # 消费者函数,从队列里取产品

s = q.get()

print ('服务员{}被叫走了'.format(s))

l = []

q = queue.LifoQueue()        # 后进先出,把LifoQueue改成Queue,先进先出。

for i in range(5):

n = random.randint(1,7)

t = threading.Thread(target=productor,args=(i,n))    # 生产线程

l.append(t)

t.start()

for i in l:

i.join()

customer()

#-----运行结果:因为有Random,所以结果不固定,主要观察消费顺序。------

服务员0有时间了

服务员0被叫走了

服务员1有时间了

服务员1被叫走了

服务员4有时间了

服务员3有时间了

服务员2有时间了

服务员2被叫走了

服务员3被叫走了

服务员4被叫走了

参考资料:

python队列长度_[python模块]队列queue相关推荐

  1. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

  2. [转载] python中 堆heapq以及 队列queue的使用

    参考链接: Python中的堆队列(Heap queue或heapq) python中 堆heapq以及 队列queue的使用 1. 堆heapq的使用 ## -------------------- ...

  3. python判断队列是否为空_[python模块]队列queue

    一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...

  4. 初识python 视频_#python day02 初识python 学习视频来源于 太白金星

    #python day02 初识python 学习视频来源于 太白金星 ''' 知识点:安装PyCharm''' # 设置鼠标条件字体大小:file ->settings # 搜索mouse E ...

  5. 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

    一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...

  6. python数据模型_#PYTHON#数据模型 | 学步园

    今天,谈谈python中的数据模型,当然你可以不了解这些东西,照样可以写出漂亮的python代码,但是"知其然知其所以然"是我的作风,总是不明白python的一些机制,心里很不爽. ...

  7. python 错误代码_[python]WindowsError的错误代码详解

    转自:http://www.aichengxu.com/view/46906 WindowsError的错误代码详解 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. ...

  8. python评价指标_[Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择...

    从本系列文章开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前五篇文章讲解了神经网络基础概念.Theano库的安装过程及基础用法.theano实现回归神经网络.theano实现 ...

  9. 小甲鱼python笔记_[Python]之前初学python,看小甲鱼视频的笔记(未整理)

    BIF == Built-in functions (内置函数) 用冒号: 而不是分号: 001作业 0.Python是一种面向对象的脚本语言. 1.IDLE是python的一个shell. 2.输出 ...

最新文章

  1. 张拳石:深度学习可解释理论的统一体系与去芜存菁 | 青源 Talk 第 14 期
  2. 流行的14个机器学习编程语言框架和工具
  3. 安卓 内存泄漏检测工具 LeakCanary 使用
  4. JVM:jstack
  5. pcb地线应该不应该做成环路_干货|图文详解EMC的PCB设计技术
  6. angularJs项目初建
  7. QPW 系统管理后台用户表(tm_user_info)
  8. Linux嵌入式入门
  9. python语言适合哪些领域的计算问题数据处理和文本挖掘_R和Python中文本挖掘8大入门指南...
  10. Flex 结合sandy引擎创造
  11. 【常识】2016-10-26
  12. css 背景色半透明 子元素不透明
  13. 今天8月5号 2011-08-05
  14. android 弹窗banner,弹窗交互规范分析|UI|观点|DesigneR_D - 原创文章 - 站酷 (ZCOOL)
  15. windows环境中java jdk环境配置
  16. 211计算机考研到985难度,普通人想考研到985/211院校到底有多难?听听他们的心声!...
  17. lambda 表达式forEach中获取元素下标
  18. 苹果手机怎么看生产日期?参考方法在这!
  19. QQ看点内容中心存储系统介绍
  20. 从零开始的异界生活(偏了)从零开始搭建lamp服务ECShop,简单快速

热门文章

  1. 用VC++实现console程序显示彩色文本
  2. 再见,余!额!宝!!!
  3. 微软 Edge 浏览器将推出 iOS 和 Android 版
  4. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
  5. 颠覆教科书:打破50年来的认知,DNA同义突变会影响蛋白质折叠,进而影响细胞生长...
  6. 软件测试b s环境如何配置,B/S架构测试环境搭建_DB2篇(Win32系统)
  7. mysql 聚合函数求积_Oracle聚合求和和聚合求积(顺便解决BOM展开的问题)
  8. 《小学生C++趣味编程》第2课 春晓 动动脑 第1题-2018-12-12
  9. 求最大值c语言常用方法,c语言如何求最大值
  10. jquery实现上下左右键盘监听_jQuery监听键盘事件及相关操作使用