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模块的接口,二者在使用层面,有很大的相似性 官网链 ...
随机推荐
- maven基础依赖外部lib包(依赖钉钉sdk为例)
jar包放置位置 pom.xml指定依赖 1 <dependencies> 2 <!--钉钉工具包,如缺失请到钉钉服务器开发文档下载--> 3 <dependency&g ...
- python -m SimpleHTTPServer搭建简单HTTP服务
PYTHON自带HTTP服务,命令: python -m SimpleHTTPServer 使用上述命令将当前目录发布到8000端口,为当前进行,不是后台运行 指定端口: python -m Simp ...
- Python的Colorama模块
简介 Python的Colorama模块,可以跨多终端,显示字体不同的颜色和背景,只需要导入colorama模块即可,不用再每次都像linux一样指定颜色. 1. 安装colorama模块 1 pip ...
- Zabbix使用主动模式进行监控配置方法
一直都是在用Zabbix的被动模式(即默认模式)进行监控. 但是总有些情况是不适用被动模式的,刚好工作上有这个需求,于是捣鼓了一下,发现配置起来也挺简单的. (1)Agent配置 修改Zabbix-a ...
- Redis常用运维命令
1.启动命令 按照我其他博客的按照方法,启动命令为/etc/init.d/redis_6379 start 2.查看内存统计信息 [root@bogon ~]# redis-cli > info ...
- 20190726_安装CentOS7minimal版本后需要做的优化和配置
20190726_安装CentOS7minimal版本后需要做的优化和配置 CentOS系统镜像下载地址:https://www.centos.org/ CentOS的Minimal(最小化安装版本) ...
- Navicat 创建oracle表空间、新建用户、授权
1.利用数据库管理员账号:SYSTEM,再配合数据库管理口令,连接Oracle数据库. 登录界面: 2.创建表空间文件 进入如下界面 进入如下界面 弹出如下界面,输入表空间名称 最终结果: 2 .新 ...
- (八)pdf的构成之文件体(page属性)
资源(Resources) 类型:字典 属性: Font :一个字典,内部是该资源包含的各个字体的名称(字体名称F开头) ProcSet :该资源中使用图画还是文字,可选 /PDF /Text /Im ...
- WPS生成多级编号
需求: 目前标题是标题1,想要 string 是二级标题,并且编号是 2.1 方案: (1)设置string是二级标题 (2)设置多级编号 选中,右击,选择[项目符号和编号] 选择[多级编号],点击[ ...
- C# 读取Oracle数据库视图数据异常问题处理
会出现类似现在这种提示的错误 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本 情况1.开发过程中遇到这种问题解决 由于.net ...