python消息队列Queue
实例1:消息队列Queue,不要将文件命名为“queue.py”,否则会报异常“ImportError:
cannot import name 'Queue'”
#coding=utf-8
from multiprocessing import Queue
q = Queue(3)#初始化一个Queue对象,最多可接收三条put消息
q.put('message-1')
q.put('message-2')
print(q.full())#False,是否满了
q.put('message-3')
print(q.full())#True
#因为消息队列已满,下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个try会立即抛出异常
try:
q.put('message-4',True,2)
except:
print('except1,消息队列已满,现有消息数量:%s'%q.qsize())
try:
q.put_nowait('message-4')
except:
print('except2,消息队列已满,现有消息数量:%s'%q.qsize())
#判断队列是否已满
if not q.full():
q.put_nowait('message-4')
#读取消息时,先判断消息队列是否为空,在读取
if not q.empty():
for i in range(q.qsize()):
print(q.get())#q.get会阻塞,q.get_nowait()不阻塞,但会抛异常
False
True
except1,消息队列已满,现有消息数量:3
except2,消息队列已满,现有消息数量:3
message-1
message-2
message-3
实例二:通过Process进程间通信
from multiprocessing import Process,Queue
import os,time,random
#写数据
def write(q):
for value in ['A','B','C']:
print('Put %s to queue...'%value)
q.put(value)
time.sleep(random.random())
#读数据
def read(q):
while True:
if not q.empty():
value = q.get(True)
print('Get %s from queue...'%value)
time.sleep(random.random())
else:
break
if __name__ == '__main__':
print('start...')
q = Queue()
#父进程的queue传递给子进程
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
#写进程
pw.start()
pw.join()
#读进程
pr.start()
pr.join()
print('done...')
start...
Put A to queue...
Put B to queue...
Put C to queue...
Get A from queue...
Get B from queue...
Get C from queue...
done...
实例三:通过Manager进程间通信
from multiprocessing import Manager,Pool
import os,time,random
#写数据
def writer(q):
print('writer启动(%s),父进程为(%s)'%(os.getpid(),os.getppid()))
for i in 'chaoge':
q.put(i)
#读数据
def reader(q):
print('reader启动(%s),父进程为(%s)'%(os.getpid(),os.getppid()))
for i in range(q.qsize()):
print('reader 从Queue获取到消息:%s'%q.get())
if __name__ == '__main__':
print('(%s) start'%os.getpid())
q = Manager().Queue()#使用Manager中的Queue来初始化
po=Pool()
#使用阻塞模式创建进程,这样就不需要再reader中使用死循环了,可以等write执行完成后,再用reader
po.apply(writer,(q,))
po.apply(reader,(q,))
#写进程
po.close()
po.join()
print('(%s) End'%os.getpid())
(7720) start
writer启动(7284),父进程为(7720)
reader启动(8712),父进程为(7720)
reader 从Queue获取到消息:c
reader 从Queue获取到消息:h
reader 从Queue获取到消息:a
reader 从Queue获取到消息:o
reader 从Queue获取到消息:g
reader 从Queue获取到消息:e
(7720) End
python消息队列Queue的更多相关文章
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- Python消息队列工具 Python-rq 中文教程
原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...
- python消息队列snakemq使用总结
Python 消息队列snakemq总结 最近学习消息总线zeromq,在网上搜了python实现的消息总线模块,意外发现有个消息队列snakemq,于是拿来研究一下,感觉还是很不错的,入手简单使用也 ...
- 消息队列queue
一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程 ...
- Python 单向队列Queue模块详解
Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...
- python多进程之间的通信:消息队列Queue
python中进程的通信:消息队列. 我们知道进程是互相独立的,各自运行在自己独立的内存空间. 所以进程之间不共享任何变量. 我们要想进程之间互相通信,传送一些东西怎么办? 需要用到消息队列!! 进程 ...
- Python消息队列(RabbitMQ)
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用.可维护多个队列,可实现消息的一对一和广播等方式发送 RabbitMQ是一个开源的AMQP实现 ...
- python - 消息队列
消息队列分类 1.先进先出 2.后进先出 3.优先级队列 4.双向队列 1.先进先出 import queue q = queue.Queue(2) #队列最大长度 q.put(11) q.put(2 ...
随机推荐
- Python基础学习Day4 列表的使用方法、range 用法、in用法
一.列表 1.1列表:python基础数据类型之一:其他语言也有列表的概念,js 数组,可索引 ,可切片,可加步长 1.2列表的索引,切片,切片+ 步长 结果: 注意:列表里元素的数据类型,就是它本身 ...
- TensorFlow常用函数
[1]卷积层(Convolutional Layer),构建一个2维卷积层,常用的参数有 conv = tf.layers.conv2d( inputs=pool, filters=64, kerne ...
- OpenCV SVM
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...
- Java的学习03
今天依然记录一下,学习情况,可以看到自己每一天都在进步. import java.text.DateFormat; import java.text.ParseException; import ja ...
- Activity 与 Task
[Activity 与 Task] A task is a collection of activities that users interact with when performing a ce ...
- cdh 安装系列3--cdh manager 安装 cdh 6.01 版本
安装前提是cdh manager 已经可以通过admin登录,管理台安装在192.168.20.163 一.安装自动TLS Setup Auto-TLS 1.ssh 192.168.20.163 2. ...
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...
- redis做消息列队
#encoding:utf8 import time import redis conn = redis.Redis('localhost',db=1) #连接诶数据库并使用数据库1 def inse ...
- vue通过ID(参数)修改URL复用同一个页面(组件)不重新加载的问题
项目中经常会用到同一个页面,结构是相同的,我只是在vue-router中通过添加参数的方式来区分状态,参数可以在页面跳转时带上params,或者query,但是有一个问题,即使我们修改了参数,URL也 ...
- poj1019(打表预处理+数学)
题目链接:http://poj.org/problem?id=1019 题意:对于序列1121231234...,求第i个数字(i<=2147483647). 思路:记第一组为1,第二组为12, ...