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基础教程之获取本机ip数据包示例
Feb 10 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
python实现二叉查找树实例代码
Feb 08 Python
在双python下设置python3为默认的方法
Oct 31 Python
Django框架自定义session处理操作示例
May 27 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
Python中Selenium模块的使用详解
Oct 09 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Flask配置Cors跨域的实现
2019/07/12 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
生物技术毕业生自荐信
2013/10/23 职场文书
创新比赛获奖感言
2014/02/13 职场文书
典型事迹材料范文
2014/12/29 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js