Python并发编程-queue
Python并发编程-queue
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Queue
# !/usr/bin/env python
# _*_conding:utf-8_*_
# @author :yinzhengjie
# blog:http://www.cnblogs.com/yinzhengjie from queue import Queue """
Queue是先进先出(First-in-First-out)队列,常用方法如下:
queue.Queue(maxsize=0):
创建FIFO队列,返回Queue对象
maxsize表示队列大小,小于等于0则队列长度没有限制 Queue.get(block=True,timeout=None):
从队列中移除元素并返回这个元素
block为阻塞,timeout为超时
如果block为True,是阻塞,timeout为None就是一直阻塞
如果block为True单timeout有值,就阻塞到一定描述抛出Empty异常
block为False,是非阻塞,timeout将被忽略,要么成功返回一个元素,要么抛出empty异常 Queue.get_nowait():
等价于get(False),也就是说要么成功返回一个元素,要么抛出empty异常
但是queue的这种阻塞效果,需要多线程来演示 Queue.put(item,block=True,time=None):
把一个元素加入到队列中去
block=True,timeout=None,表示如果当前队列已经满了,则一直阻塞直至有空位存放元素。
block=True,timeout=5,表示如果当前队列已经满了,则阻塞五秒依旧没有空位存放元素就抛出Full异常
block=Flase,timeout失效,立即返回,能塞进去就塞进去,不能就抛出Full异常。 Queue.put_nowait(item):
等价于Queue.put(item,False),也就是能塞进去就塞,不能就抛出Full异常
""" q = Queue(3) # 设置队列大小为3
q.put("hdfs")
q.put("mapreduce")
print(q.qsize(), q.full())
q.put("yarn")
print(q.qsize(), q.full())
# q.put("hbase") #这里会阻塞,因为上面已经网队列中放慢3个了,再放是没法放进队列啦,直到有人消费数据才能有多余的空间存入 print(q.get())
print(q.qsize(), q.empty())
print(q.get())
print(q.qsize(), q.empty())
print(q.get())
# print(q.get()) #这里也会阻塞,因为已经从队列中取出三个了,再去是取不出来啦,直到有人放入数据才能取到数据
# print(q.get(timeout=3)) #阻塞,但超时3秒还拿不到数据就会抛出Empty异常。
2 False
3 True
hdfs
2 False
mapreduce
1 False
yarn
以上代码执行结果戳这里
二.LifoQueue
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie from queue import LifoQueue
"""
LifoQueue是后进先出队列,这个类继承自Queue,使用方式同Queue。
""" q = LifoQueue(3) #设置队列大小为3
q.put("hdfs")
q.put("mapreduce")
print(q.qsize(),q.full())
q.put("yarn")
print(q.qsize(),q.full())
# q.put("hive") #这里会阻塞,因为上面已经网队列中放慢3个了,再放是没法放进队列啦,直到有人消费数据才能有多余的空间存入 print(q.get())
print(q.qsize(),q.empty())
print(q.get())
print(q.qsize(),q.empty())
print(q.get())
# print(q.get()) #这里也会阻塞,因为已经从队列中取出三个了,再去是取不出来啦,直到有人放入数据才能取到数据
# print(q.get(timeout=3)) #阻塞,但超时3秒还拿不到数据就会抛出Empty异常。
2 False
3 True
yarn
2 False
mapreduce
1 False
hdfs
以上代码执行结果戳这里
三.PriorityQueue
# !/usr/bin/env python
# _*_conding:utf-8_*_
# @author :yinzhengjie
# blog:http://www.cnblogs.com/yinzhengjie from queue import PriorityQueue
import random
from string import ascii_lowercase """
PriorityQueue是优先队列,这个类继承自Queue类,并重写了入队,出队的方法。
它里面是堆,用列表实现的堆,构建的是小顶堆。
元素可以存储任意值,但是优先队列内部是直接进行元素大小比较的,不同类型比较可能抛出异常
入队时,将元素加入到列表末尾,然后进行小顶堆调整
出队时,将索引0即堆顶处最小值弹出,然后将最后一个元素放到堆顶,重新堆调整。
""" q = PriorityQueue() gender = ["boy","girl"] #我们模拟一下男生和女士,不管传入的字符串随机字符串是如何,最终取出来的数据应该是男士优先的 for i in range(10):
q.put("{} : {}".format(random.choice(gender),random.choice(ascii_lowercase))) while not q.empty():
print(q.get_nowait())
boy : m
boy : m
boy : s
boy : w
girl : a
girl : a
girl : d
girl : h
girl : m
girl : y
以上代码执行结果戳这里
Python并发编程-queue的更多相关文章
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python并发编程一(多进程)
1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- Python并发编程系列之多进程(multiprocessing)
1 引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心 ...
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
随机推荐
- Delphi根据不同分隔符获取字符串内容
function GetFieldValue(separator:Char;strLine: string; nNum: Integer): string; var Strs :TStrings; R ...
- 一步一步FLASK(一)
简介: 本文是记录本人建立一个flask项目的完整过程. 涉及FLASK的诸多实用技术. 一:基本FLASK pycharm建立FLASK项目即可运行. 代码如下: from flask import ...
- Centos7无法播放mp4视频(待验证)
新安装Centos7后,发现无法正常播放本地mp4视频 可以尝试安装 yum -y install ffmpeg 安装之后,需要重启电脑才能生效 浏览器安装年flash,只能播放部分视频,也有可能是s ...
- FinalShell—一体化服务器管理软件(SSH客户端)
下面附上一些截图和官方连接: 官网:http://www.hostbuf.com/ FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发 ...
- Navicat连接Mysql8.0.11出现1251错误
# 登录mysql mysql -u root -p # 修改加密规则 mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_pas ...
- 递归下降和LL(1)语法分析
什么是自顶向下分析法 在语法分析过程中一般有两种语法分析方法,自顶向下和自底向上,递归下降分析和LL(1)都属于是自顶向下的语法分析 自顶向下分析法的过程就像从第一个非终结符作为根节点开始根据产生式进 ...
- jquery如何生成图片验证码
jQuery(function($){ /**生成一个随机数**/ function randomNum(min, max) { return Math.floor(Math.random() * ( ...
- Oracle中恢复drop掉的表中的数据
今天同事不小心把生产上的一张表直接drop掉了,没有做备份,哥们慌的一匹,来找我这个小白来帮忙解决,于是心血来潮简单总结一下. 其实在oralce中,用drop删掉一张表,其实不会真正的删除,只是把表 ...
- 【转帖】Intel AMD 龙芯2019年12月份最新产品线
Intel未来三代U集体曝光:14nm退回去了! https://news.cnblogs.com/n/651244/ 不过没搞懂 为啥中芯国际已经开始量产14nm了 龙芯为什么不用.. 3A4000 ...
- python 之 面向对象 (异常处理)
7.15 异常处理 1.什么是异常 异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止 2.一个异常分为三部分: 异常的追踪信息 ...