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模块的接口,二者在使用层面,有很大的相似性 官网链 ...
随机推荐
- [Metricbeat] Metricbeat监控golang服务器
0x0 前言 最近这几天研究了一下ElasticSearch相关的技术栈.前面一篇转发了别人些的非常详细的ElasticSearch和Kibana搭建的过程.发现Elastic家族还有Metricbe ...
- windos server2012安装.net core 2.2问题
服务器是:WinServer 2012 Standard X64 版本 服务器是:WinServer 2012 DataCenter R2 X64 版本.几个老站点本身正常.如题:.Net Core ...
- 【视频开发】ONVIF、RTSP/RTP、FFMPEG的开发实录
ONVIF.RTSP/RTP.FFMPEG的开发实录 前言 本文从零基础一步步实现ONVIF协议.RTSP/RTP协议获取IPC实时视频流.FFMPEG解码.开发环境为WIN7 32位 + VS201 ...
- log4j Logger 使用简介
项目结构: log4j.properties 内容: log4j.rootCategory=info,stdout log4j.appender.stdout=org.apache.log4j.Con ...
- K8S+GitLab+.net core-自动化分布式部署-3
K8S+GitLab-自动化分布式部署ASP.NET Core(三) 更新镜像版本并部署到K8S上 一.介绍 前一篇,介绍了ASP.NET Core部署到K8S上,下面介绍我们在发布新一版本中怎么 ...
- gRPC-拦截器简单使用
概述 gRPC作为通用RPC框架,内置了拦截器功能.包括服务器端的拦截器和客户端拦截器,使用上大同小异.主要作用是在rpc调用的前后进行额外处理. 从客户端角度讲,可以在请求发起前,截取到请求参数并修 ...
- c# EF插入数据报错跟踪代码
我们在使用EF进行数据库插入的时候或出现一些插入失败的情况,但是具体是哪个字段不符合数据库设计要求无法得知,普通的try catch 无法捕获加上一下方法就可以 try { ...
- js获取对象的属性个数
for (var i = 0; i < dt.length; i++) { if (Object.keys(dt[i]).length <= 1) { dt.splice(i, 1); i ...
- C# vb .net实现轮廓特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- int转换为String,常用的四种方法。
int i = 100; 方法一:String s1 = i + " "; 方法二:String s2 = String.valueof(i); 方法三(先转换为Integer类型 ...