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中as用法实例分析
Apr 30 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
Python函数中的可变长参数详解
Sep 12 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
Python collections模块的使用方法
Oct 09 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
scrapy爬虫实例分享
2017/12/28 Python
谈谈python中GUI的选择
2018/03/01 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
出国英文推荐信
2014/05/10 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
生日答谢词
2015/01/05 职场文书