Python多进程池 multiprocessing Pool用法示例


Posted in Python onSeptember 07, 2018

本文实例讲述了Python多进程池 multiprocessing Pool用法。分享给大家供大家参考,具体如下:

1. 背景

由于需要写python程序, 定时、大量发送htttp请求,并对结果进行处理。

参考其他代码有进程池,记录一下。

2. 多进程 vs 多线程

  • c++程序中,单个模块通常是单进程,会启动几十、上百个线程,充分发挥机器性能。(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客)
  • shell脚本中,都是多进程后台执行。({ ...} &, 可以参考我之前的博客,实现shell并发处理任务)
  • python脚本有多线程和多进程。由于python全局解锁锁的GIL的存在,一般建议 CPU密集型应该采用多进程充分发挥多核优势,I/O密集型可以采用多线程。

尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。
实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。
GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

3. multiprocessing pool使用例子

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了

#coding=utf-8
import logging
import time
from multiprocessing import Pool
logging.basicConfig(level=logging.INFO, filename='logger.log')
class Point:
  def __init__(self, x = 0, y= 0):
    self.x = x
    self.y = y
  def __str__(self):
    return "(%d, %d)" % (self.x, self.y)
def fun1(point):
  point.x = point.x + 3
  point.y = point.y + 3
  time.sleep(1)
  return point
def fun2(x):
  time.sleep(1)
  logging.info(time.ctime() + ", fun2 input x:" + str(x))
  return x * x
if __name__ == '__main__':
  pool = Pool(4)
  #test1
  mylist = [x for x in range(10)]
  ret = pool.map(fun2, mylist)
  print ret
  #test2
  mydata = [Point(x, y) for x in range(3) for y in range(2)]
  res = pool.map(fun1, mydata)
  for i in res:
    print str(i)
  #end
  pool.close()
  pool.join()
  print "end"

运行结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
(3, 3)
(3, 4)
(4, 3)
(4, 4)
(5, 3)
(5, 4)
end

4. 参考

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python编码类型转换方法详解
Jul 01 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
python获取代理IP的实例分享
May 07 Python
TensorFlow实现简单卷积神经网络
May 24 Python
Pandas 同元素多列去重的实例
Jul 03 Python
python实现车牌识别的示例代码
Aug 05 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
pyinstaller还原python代码过程图解
Jan 08 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
详解python while 函数及while和for的区别
Sep 07 #Python
使用TensorFlow实现SVM
Sep 06 #Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 #Python
python实现机器学习之多元线性回归
Sep 06 #Python
python实现机器学习之元线性回归
Sep 06 #Python
Python import与from import使用及区别介绍
Sep 06 #Python
用python实现k近邻算法的示例代码
Sep 06 #Python
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
Dedecms常用函数解析
2008/02/01 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
python文件名和文件路径操作实例
2017/09/29 Python
python中的计时器timeit的使用方法
2017/10/20 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
人事专员岗位职责说明书
2014/07/30 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
整理Python中常用的conda命令操作
2021/06/15 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang