多进程的优势尽管Python中的线程是OS原生的(它们不是被模拟出来的,它们是真实的操作系统线程),它们被全局解释器锁(GIL)所束缚,所以同一时刻只有一个线程可以和Python对象交互。

通过使用多进程,我们并行运行一定数量的Python解释器,每一个进程都有私有的内存空间,有自己的GIL,并且每一个都穿行运行(所有没有GIL之间的竞争),这是在Python中提升CPU密集型任务速度的最简单方式。

为什么要用进程池

如果每个任务使用一个进程,每处理一个任务都会伴随着一个进程的创建、运行、销毁,如果进程的运行时间越短,创建和销毁的时间所占的比重就越大,显然,我们应该尽量避免创建和销毁进程本身的额外开销,提高进程的运行效率。我们可以用进程池来减少进程的创建和开销,提高进程对象的复用。

Python的进程池Python中已经实现了一个功能强大的进程池(multiprocessing.Pool),可以很方便地创建进程池对象。

要创建进程池对象,需要调用Pool函数,函数的声明如下:Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None)processes表示工作进程的个数,默认为None,表示worker进程数为cpu_count()

initializer表示工作进程start时调用的初始化函数,initargs表示initializer函数的参数,如果initializer不为None,在每个工作进程start之前会调用initializer(*initargs)

maxtaskperchild表示每个工作进程在退出/被其他新的进程替代前,需要完成的工作任务数,默认为None,表示工作进程存活时间与pool相同,即不会自动退出/被替换。

函数返回一个进程池(Pool)对象

分配任务和同步异步

Pool对象有下面几个主要的方法用于将任务分配到进程池中去,它们分别是apply 单个任务同步

apply_async 单个任务异步

map 多个任务同步

map_async 多个任务异步 其中不带async的方法都会阻塞到任务完成,才会继续运行其后的代码。

下面是一个例子:

def task_short(num):

time.sleep(3)

print("I am task: {0}\n".format(num))

def task_long(num):

while True:

print("I am task: {0}\n".format(num))

time.sleep(1)

if __name__ == "__main__":

pool = Pool(processes=5)

# 异步任务

pool.apply_async(task_short, args=(10, ))

# 同步任务

pool.map(task_long, range(10))

print("main process")

该例子创建了一个有5个worker的进程池,并先将1个任务task_short异步地加入进程池中运行,然后又将10个任务task_long同步地加入进程池中。

由于task_short需要3秒才能执行完,所以一开始task_long任务可用的worker进程只有4个。3秒后task_short完成,进程池会自动再加载1个task_long任务交给刚刚空闲的那个worker进程执行。

由于task_long任务永远不会结束,所以其他剩余的任务5到9都没有机会执行。

局限

通过上面的例子,我们发现进程池不适合执行那些永远不会完成的任务,比如后台服务,因为没有worker进程执行完成的话,其他的进程就永远不会被执行。

multiprocessing.dummy

multiprocessing.dummy里面也有一个Pool对象,它其实就是线程的封装,使用起来和multiprocessing的Pool非常类似。

因为多进程适合计算密集的多任务,多线程适合IO密集的多任务,所以在代码里面使用下面两句,需要的时候注释掉其中之一,可以做到进程模型和线程模型的一键切换。

如果你不知道自己的程序是计算密集的还是IO密集的,就切换下试试,哪个性能表现好,就用哪个。from multiprocessing.dummy import Pool # 多线程

from multiprocessing import Pool # 多进程

代码下载

本系列文章和代码已经作为项目归档到github,大家觉得有帮助就请在github上star一下,你的支持是我更新的动力。github仓库地址:jumper2014/PyCodeComplete

python 进程池_Python实践17-进程池相关推荐

  1. python进程池和线程池_Python中的进程池与线程池(包含代码)

    引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用submit异步调用 异步+回调函数 ...

  2. linux多进程server 进程池_Python 中的进程池与多进程

    封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...

  3. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

  4. python爬虫进程池_python爬虫之进程池爬取(世纪佳缘案例)

    from concurrent.futures import ProcessPoolExecutor import requests import time,re,json from lxml.htm ...

  5. python爬虫进程池_python爬虫之进程池爬虫(世纪佳缘案例)

    from multiprocessing import Process,Queue import requests import re from lxml.html import etree impo ...

  6. python线程监控_Python监控php-fpm进程

    我们来一个不断进阶的fpm监控任务,熟悉python脚本的编写.选择python是因为python具备很好的扩展性,比如需要elasticSearch的功能pip安装一下就可以了.完成本脚本后,我们可 ...

  7. python控制系统进程_python 监控windows进程

    python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动 用python监控您的window服务 原创作品,允许转载,转载时请务 ...

  8. python实现数据库连接池_Python实现Mysql数据库连接池

    Python实现Mysql数据库连接池 python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都 ...

  9. python ip代理池_python实现ip代理池功能示例

    本文实例讲述了python实现ip代理池功能.分享给大家供大家参考,具体如下: 爬取的代理源为西刺代理. 用xpath解析页面 用telnet来验证ip是否可用 把有效的ip写入到本地txt中.当然也 ...

最新文章

  1. 平面上的点和直线上的点一样多
  2. vscode使用教程python-VsCode使用教程
  3. layui如何获取父节点的父节点_jquery获取父元素或父节点的方法
  4. 浏览器在DPI缩放时变化问题
  5. 大数据学习系列----基于Spark Streaming流式计算
  6. 让你的Silverlight程序部署在任意服务器上
  7. [Swift]LeetCode482. 密钥格式化 | License Key Formatting
  8. 面试必会之LinkedList源码分析
  9. 每天一个linux命令(56)--crontab命令
  10. 三丰三坐标编程基本步骤_日常皮肤护理的基本三步骤,问题皮肤不要作
  11. 三菱modbusRTU通讯实例_PLC编程 | 用三菱PLC控制机械手实例
  12. java开发webservice接口_webservice接口的开发和调用
  13. HMC5883L 磁力计校准
  14. ubuntu显卡测试软件,Linux显卡性能测试程序Unigine Valley 和 Unigine Heaven
  15. matlab怎么导入程序出错,Matlab导入数据时出错!十分困扰!
  16. iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...
  17. 基于BP神经网络的车牌识别问题研究附Matlab代码
  18. spring定时任务总结
  19. 读取csv时中文乱码问题
  20. 《从零开始的RPG游戏制作教程》第二期:让勇者和怪物登场

热门文章

  1. Apache kafka原理与特性(0.8V)
  2. spring-data-jpa原理探秘(2)-RepositoryQuery的用途和分类
  3. 转:多条件查询测试用例设计方法——pairwise
  4. wordpress如何设置文章置顶以及区分置顶文章与普通文章
  5. Button 的 clilck 事件
  6. 给刚入行的存储工程师10+1点建议
  7. 信息学奥赛一本通 1344:【例4-4】最小花费 | 洛谷 P1576 最小花费
  8. 图论 —— 生成树 —— 次小生成树
  9. 转进制(信息学奥赛一本通-T1161)
  10. 7.1 SAP MASS批量修改操作手册