python queue 多进程_python中的Queue与多进程(multiprocessing)
最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程
一、先说说Queue(队列对象)
Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多
import Queue
q = Queue.Queue(10)
向队列中放值(put)
q.put(‘yang’)
q.put(4)
q.put([‘yan’,’xing’])
在队列中取值get()
默认的队列是先进先出的
>>> q.get()
'yang'
>>> q.get()
4
>>> q.get()
['yan', 'xing']
>>>
当一个队列为空的时候如果再用get取则会堵塞,所以取队列的时候一般是用到
get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常
所以更常用的方法是先判断一个队列是否为空,如果不为空则取值
队列中常用的方法
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
Queue.get_nowait() 相当Queue.get(False)
非阻塞 Queue.put(item) 写入队列,timeout等待时间
Queue.put_nowait(item) 相当Queue.put(item, False)
二、multiprocessing中使用子进程概念
from multiprocessing import Process
可以通过Process来构造一个子进程
p = Process(target=fun,args=(args))
再通过p.start()来启动子进程
再通过p.join()方法来使得子进程运行结束后再执行父进程
from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
print 'Run child process %s (%s)...' % (name, os.getpid())
if __name__=='__main__':
print 'Parent process %s.' % os.getpid()
p = Process(target=run_proc, args=('test',))
print 'Process will start.'
p.start()
p.join()
print 'Process end.'
三、在multiprocessing中使用pool
如果需要多个子进程时可以考虑使用进程池(pool)来管理
from multiprocessing import Pool
from multiprocessing import Pool
import os, time
def long_time_task(name):
print 'Run task %s (%s)...' % (name, os.getpid())
start = time.time()
time.sleep(3)
end = time.time()
print 'Task %s runs %0.2f seconds.' % (name, (end - start))
if __name__=='__main__':
print 'Parent process %s.' % os.getpid()
p = Pool()
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print 'Waiting for all subprocesses done...'
p.close()
p.join()
print 'All subprocesses done.'
pool创建子进程的方法与Process不同,是通过
p.apply_async(func,args=(args))实现,一个池子里能同时运行的任务是取决你电脑的cpu数量,如我的电脑现在是有4个cpu,那会子进程task0,task1,task2,task3可以同时启动,task4则在之前的一个某个进程结束后才开始
上面的程序运行后的结果其实是按照上图中1,2,3分开进行的,先打印1,3秒后打印2,再3秒后打印3
代码中的p.close()是关掉进程池子,是不再向里面添加进程了,对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
当时也可以是实例pool的时候给它定义一个进程的多少
如果上面的代码中p=Pool(5)那么所有的子进程就可以同时进行
三、多个子进程间的通信
多个子进程间的通信就要采用第一步中说到的Queue,比如有以下的需求,一个子进程向队列中写数据,另外一个进程从队列中取数据,
#coding:gbk
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__':
# 父进程创建Queue,并传给各个子进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 启动子进程pw,写入:
pw.start()
# 等待pw结束:
pw.join()
# 启动子进程pr,读取:
pr.start()
pr.join()
# pr进程里是死循环,无法等待其结束,只能强行终止:
print '所有数据都写入并且读完'
四、关于上面代码的几个有趣的问题
if __name__=='__main__':
# 父进程创建Queue,并传给各个子进程:
q = Queue()
p = Pool()
pw = p.apply_async(write,args=(q,))
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print '所有数据都写入并且读完'
如果main函数写成上面的样本,本来我想要的是将会得到一个队列,将其作为参数传入进程池子里的每个子进程,但是却得到
RuntimeError: Queue objects should only be shared between processes through inheritance
的错误,查了下,大意是队列对象不能在父进程与子进程间通信,这个如果想要使用进程池中使用队列则要使用multiprocess的Manager类
if __name__=='__main__':
manager = multiprocessing.Manager()
# 父进程创建Queue,并传给各个子进程:
q = manager.Queue()
p = Pool()
pw = p.apply_async(write,args=(q,))
time.sleep(0.5)
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print '所有数据都写入并且读完'
这样这个队列对象就可以在父进程与子进程间通信,不用池则不需要Manager,以后再扩展multiprocess中的Manager类吧
关于锁的应用,在不同程序间如果有同时对同一个队列操作的时候,为了避免错误,可以在某个函数操作队列的时候给它加把锁,这样在同一个时间内则只能有一个子进程对队列进行操作,锁也要在manager对象中的锁
#coding:gbk
from multiprocessing import Process,Queue,Pool
import multiprocessing
import os, time, random
# 写数据进程执行的代码:
def write(q,lock):
lock.acquire() #加上锁
for value in ['A', 'B', 'C']:
print 'Put %s to queue...' % value
q.put(value)
lock.release() #释放锁
# 读数据进程执行的代码:
def read(q):
while True:
if not q.empty():
value = q.get(False)
print 'Get %s from queue.' % value
time.sleep(random.random())
else:
break
if __name__=='__main__':
manager = multiprocessing.Manager()
# 父进程创建Queue,并传给各个子进程:
q = manager.Queue()
lock = manager.Lock() #初始化一把锁
p = Pool()
pw = p.apply_async(write,args=(q,lock))
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print '所有数据都写入并且读完'
参考文章:
相关文章:

postman测试上传文件
输入url:http://127.0.0.1:8081/uploadfile 选择post方式 选择body 选择form-data,text改为file 输入key:file ,value:选择文件 send即可 转载于:https://www.cnblogs.com/shimh/p/6094410.html

区块链资产安全攻略
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 本文从钱包、密码、软件、备份、交易所、习惯几个方面给出一些指引。 钱包 每个钱包在熟练使用之前,请用小额测试。 有条件购买硬件钱…

win10安装docker并结合Idea2018.1部署springboot项目
一、准备工作 1.、工具:win10,idea2018,maven3.5,jdk8 二、win10安装docker 1、win10安装docker:http://www.runoob.com/docker/windows-docker-install.html 2、安装完毕后,点击小鲸鱼,选择set…

在桌面右键菜单,停止工作,并提示“资源管理器停止工作”等情况。
在配置文件中,找到右键管理菜单,然后删除NvCp开头的扩展项有问题,去掉就完事了。转载于:https://www.cnblogs.com/wangfengderizi/p/6094446.html

ue4cmd怎么调用_[UE4,automation]UE4批渲染cmd篇
之前做项目的过程中,有一部分工作是在UE4里制作输出小短片。由于要完成的量比较大,所以研究了一些批渲染的方法。逻辑上跟以前在maya里用batch render差不多,不过UE4这边的设置相对繁琐一点点。本文讲解了在不打开UE4软件的前提下,…

区块链将带来怎样的应用?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 在上一篇文章中,咱们聊到了区块链技术正在与大数据、云计算、物联网以及人工智能这些技术链接,随时可能碰撞出技术创新的火…

【Spark】Spark2.x版的新特性
一、API 1. 出现新的上下文接口:SparkSession,统一了SQLContext和HiveContext,并且为SparkSession开发了新的流式调用的configuration API 2. 统一了DataFrame和DataSet。DataFrame相当于DataSet[Row],以及DataSet的增强聚合API 3…

python基础主要内容_python基础—python的介绍
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并…

Web Serveice服务代理类生成及编译
一、生成代理类 对于web service服务和wcf的webservice服务,我们都可以通过一个代理类来调用。 怎么写那个代理类呢?通过一个工具生成即可!!微软为我们提供了一个wsdl.exe的Web服务描述语言工具,wsdl.exe从 WSDL 协定文…

生成器/迭代器 和 函数的递归
生成器 一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个…

CDN -- 集合
weui https://cdnjs.cloudflare.com/ajax/libs/weui/0.4.3/style/weui.min.css 百度静态资源库 http://cdn.code.baidu.com/转载于:https://www.cnblogs.com/xuange306/p/6102407.html

python清华大学出版社第三章课堂作业的答案_Python程序设计清华大学出版社董付国第3章选择与循环题库.ppt...
3.5 综合运用 例2:输出序列中的元素。 a_list[a, b, mpilgrim, z, example] for i,v in enumerate(a_list): print 列表的第, i1, 个元素是:, v 3.5 综合运用 例3:求1~100之间能被7整除,但不能同时被5整除的所有整数 。 for i in …

以太坊私链入门
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载 目录 背景软件安装与配置 2.1. Ubuntu 2.1.1. 安装 geth 2.1.2. 安装 solc 2.2. Windows 2.3. Mac OS 2.4. 编译安装创世区块 3.1. 初始化创世区块 …

数据结构(十)栈的作用--大数的加法运算
一、大数加法的定义 在Java中,整数类型有四种,byte(8位)、short(16位)、int(32位)、long(64位)。 其中,int类型为32为,也就是说最大的…

分布式技术一周技术动态 2016-11-27
分布式系统实践 1. 大数据时代快速SQL引擎-Impala http://dwz.cn/4G9mvt 摘要: 在Dremel论文发表之后,开源社区涌现出了一批基于MPP架构的SQL-on-Hadoop(HDFS)查询引擎,典型代表有Apache Impala、Presto、Apache Drill、Apache HAWQ等,看上去…

vuerouter3种模式_Vue-router的三种传参方式
第一种传递参数:name传参两步完成name传参并显示在模板中;第一在router/index.js中配置name属性,routes: [{path: /,name: HelloWorld,component: HelloWorld},]第二步在src/App.vue接收{{ $route.name }}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

以太坊的数据结构
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊被描述为为一个交易驱动的状态机,它在某个状态下接受一些输入后,会确定的转移到一个新的状态。具体来说,…

(转载)虚幻引擎3--9掌握虚幻技术UnrealScript 预处理器
第九章 – UNREALSCRIPT预处理器9.1概述9.2 MACRO(宏)的基础知识指南 9.1 –您的第一个宏9.3具有参数的宏指南 9.2 – MACRO参数9.4内置宏DEFINE IF/ELSE/ENDIF 实例: IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用 …

springboot添加多数据源连接池并配置Mybatis
springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 星期六,那是个晴天,天湛蓝湛蓝的非常干净,仿佛飘过一粒尘埃也能看得清清楚楚,然后就发生…

lua菜鸟教程_Lua 环境安装
Lua 环境安装Linux 系统上安装Linux & Mac上安装 Lua 安装非常简单,只需要下载源码包并在终端解压编译即可,本文使用了5.3.0版本进行安装:curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make …

以太坊智能合约Demo
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智…

Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组。若将里面的方法用熟的话,那开发效率会大大提高。下面介绍其中的方法。 List<T> asList(T... a) 作用:将指定数组或数组元素,转换成固定大小的List。…

c++窗口管理系统是什么_优秀的食堂管理系统让你对校园生活更充满希望
面对今年疫情环境下的种种困难,各大高校纷纷根据情况采取不同的措施,应对开学的各种难题。解决返校学生就餐就是一大难点。学校后勤工作人员少之又少,开设的食堂窗口也供不应求。这也直接导致了后勤人员懒散,食堂阿姨给菜“手抖”…

ACM训练小结-2018年6月16日
今天题目情况如下:A题:线段树XOR性质。情况:由于写法问题,调试困难,浪费大量时间。B题:(对所有满足i mod pq,求a[i]之和),无修改,直接上n*sqrt(n)…

加密货币的本质
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 去年,比特币暴涨,其他币也像雨后春笋一样冒出来,已经有1000多种了。 很多人都在问,加密货币&#…

「2018山东一轮集训」 Tree
为什么出题人这么毒瘤啊??!!一个分块还要带log的题非要出成n<2*1e5。。。。。。。 为了卡过最后两个点我做了无数常数优化,包括但不限于:把所有线段树改成 存差分的树状数组;把树剖求LCA的极…

mysql 表空间收缩_mysql表碎片清理和表空间收缩
mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式)OPTIMIZETABLE [tablename],当然这种方式只适用于独立表空间清除碎片的优点:降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率OPTIMIZE TABLE ipvacl…

spring security remember me实现自动登录
1 默认策略 在我们自定义的login中增加一个选择框 <input type"submit" value"Login" /> <br/> <br/> <input type"checkbox" valuetrue name"_spring_security_remember_me" />记住密码 <!-- 记住…

野指针与内存泄漏那些事
野指针:不是NULL指针,是指向垃圾内存的指针 野指针成因: 1.指针变量没有被初始化:指针变量在创建时同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 2.指针p被free或者delete,没有被设置为…

参数等效模型可以用于_等效媒质理论(介电参数反演)
听说过超材料的读者大概率会了解一个知识点,复杂的媒质块可以等效为一块平板,当然这是有条件的。比如模型小于十分之一波长之类的,尤其对模型厚度要求严格些。大家在查找等效媒质理论文献的时候,可能会被繁杂的理论解释弄得爆炸&a…