Python标准库之多进程(multiprocessing包)介绍


Posted in Python onNovember 25, 2014

在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。

进程池

进程池 (Process Pool)可以创建多个进程。这些进程就像是随时待命的士兵,准备执行任务(程序)。一个进程池中可以容纳多个待命的士兵。

Python标准库之多进程(multiprocessing包)介绍

“三个进程的进程池”

比如下面的程序:

import multiprocessing as mul

def f(x):

    return x**2

pool = mul.Pool(5)

rel  = pool.map(f,[1,2,3,4,5,6,7,8,9,10])

print(rel)

我们创建了一个容许5个进程的进程池 (Process Pool) 。Pool运行的每个进程都执行f()函数。我们利用map()方法,将f()函数作用到表的每个元素上。这与built-in的map()函数类似,只是这里用5个进程并行处理。如果进程运行结束后,还有需要处理的元素,那么的进程会被用于重新运行f()函数。除了map()方法外,Pool还有下面的常用方法。

apply_async(func,args)  从进程池中取出一个进程执行func,args为func的参数。它将返回一个AsyncResult的对象,你可以对该对象调用get()方法以获得结果。

close()  进程池不再创建新的进程

join()   wait进程池中的全部进程。必须对Pool先调用close()方法才能join。

练习

有下面一个文件download.txt。

www.sina.com.cn

www.163.com

www.iciba.com

www.cnblogs.com

www.qq.com

www.douban.com

使用包含3个进程的进程池下载文件中网站的首页。(你可以使用subprocess调用wget或者curl等下载工具执行具体的下载任务)

共享资源

我们在Python多进程初步已经提到,我们应该尽量避免多进程共享资源。多进程共享资源必然会带来进程间相互竞争。而这种竞争又会造成race condition,我们的结果有可能被竞争的不确定性所影响。但如果需要,我们依然可以通过共享内存和Manager对象这么做。

Python标准库之多进程(multiprocessing包)介绍

共享“资源”

共享内存

在Linux进程间通信中,我们已经讲述了共享内存(shared memory)的原理,这里给出用Python实现的例子:

# modified from official documentation

import multiprocessing

def f(n, a):

    n.value   = 3.14

    a[0]      = 5

num   = multiprocessing.Value('d', 0.0)

arr   = multiprocessing.Array('i', range(10))

p = multiprocessing.Process(target=f, args=(num, arr))

p.start()

p.join()

print num.value

print arr[:]

这里我们实际上只有主进程和Process对象代表的进程。我们在主进程的内存空间中创建共享的内存,也就是Value和Array两个对象。对象Value被设置成为双精度数(d), 并初始化为0.0。而Array则类似于C中的数组,有固定的类型(i, 也就是整数)。在Process进程中,我们修改了Value和Array对象。回到主程序,打印出结果,主程序也看到了两个对象的改变,说明资源确实在两个进程之间共享。

Manager

Manager对象类似于服务器与客户之间的通信 (server-client),与我们在Internet上的活动很类似。我们用一个进程作为服务器,建立Manager来真正存放资源。其它的进程可以通过参数传递或者根据地址来访问Manager,建立连接后,操作服务器上的资源。在防火墙允许的情况下,我们完全可以将Manager运用于多计算机,从而模仿了一个真实的网络情境。下面的例子中,我们对Manager的使用类似于shared memory,但可以共享更丰富的对象类型。

import multiprocessing

def f(x, arr, l):

    x.value = 3.14

    arr[0] = 5

    l.append('Hello')

server = multiprocessing.Manager()

x    = server.Value('d', 0.0)

arr  = server.Array('i', range(10))

l    = server.list()

proc = multiprocessing.Process(target=f, args=(x, arr, l))

proc.start()

proc.join()

print(x.value)

print(arr)

print(l)

Manager利用list()方法提供了表的共享方式。实际上你可以利用dict()来共享词典,Lock()来共享threading.Lock(注意,我们共享的是threading.Lock,而不是进程的mutiprocessing.Lock。后者本身已经实现了进程共享)等。 这样Manager就允许我们共享更多样的对象。

我们在这里不深入讲解Manager在远程情况下的应用。有机会的话,会在网络应用中进一步探索。

总结

Pool
Shared memory, Manager

Python 相关文章推荐
利用Python破解斗地主残局详解
Jun 30 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Python对List中的元素排序的方法
Apr 01 Python
python实现最长公共子序列
May 22 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
代码实例讲解python3的编码问题
Jul 08 Python
简单介绍python封装的基本知识
Aug 10 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
Python 如何在字符串中插入变量
Aug 01 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
python 如何调用 dubbo 接口
Sep 24 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 #Python
Python标准库之循环器(itertools)介绍
Nov 25 #Python
Python标准库之sqlite3使用实例
Nov 25 #Python
Python标准库内置函数complex介绍
Nov 25 #Python
Python XML RPC服务器端和客户端实例
Nov 22 #Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 #Python
python进程类subprocess的一些操作方法例子
Nov 22 #Python
You might like
php 操作符与控制结构
2012/03/07 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
js表格分页实现代码
2009/09/18 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python冒泡排序简单实现方法
2015/07/09 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
物流管理专业毕业生求职信
2014/03/23 职场文书
财产公证书样本
2014/04/04 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
2014年纪检工作总结
2014/11/12 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书