python 进程池_Python实践17-进程池
多进程的优势尽管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-进程池相关推荐
- python进程池和线程池_Python中的进程池与线程池(包含代码)
引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用submit异步调用 异步+回调函数 ...
- linux多进程server 进程池_Python 中的进程池与多进程
封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...
- python process 函数_Python Process创建进程的2种方法详解
前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...
- python爬虫进程池_python爬虫之进程池爬取(世纪佳缘案例)
from concurrent.futures import ProcessPoolExecutor import requests import time,re,json from lxml.htm ...
- python爬虫进程池_python爬虫之进程池爬虫(世纪佳缘案例)
from multiprocessing import Process,Queue import requests import re from lxml.html import etree impo ...
- python线程监控_Python监控php-fpm进程
我们来一个不断进阶的fpm监控任务,熟悉python脚本的编写.选择python是因为python具备很好的扩展性,比如需要elasticSearch的功能pip安装一下就可以了.完成本脚本后,我们可 ...
- python控制系统进程_python 监控windows进程
python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动 用python监控您的window服务 原创作品,允许转载,转载时请务 ...
- python实现数据库连接池_Python实现Mysql数据库连接池
Python实现Mysql数据库连接池 python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都 ...
- python ip代理池_python实现ip代理池功能示例
本文实例讲述了python实现ip代理池功能.分享给大家供大家参考,具体如下: 爬取的代理源为西刺代理. 用xpath解析页面 用telnet来验证ip是否可用 把有效的ip写入到本地txt中.当然也 ...
最新文章
- 平面上的点和直线上的点一样多
- vscode使用教程python-VsCode使用教程
- layui如何获取父节点的父节点_jquery获取父元素或父节点的方法
- 浏览器在DPI缩放时变化问题
- 大数据学习系列----基于Spark Streaming流式计算
- 让你的Silverlight程序部署在任意服务器上
- [Swift]LeetCode482. 密钥格式化 | License Key Formatting
- 面试必会之LinkedList源码分析
- 每天一个linux命令(56)--crontab命令
- 三丰三坐标编程基本步骤_日常皮肤护理的基本三步骤,问题皮肤不要作
- 三菱modbusRTU通讯实例_PLC编程 | 用三菱PLC控制机械手实例
- java开发webservice接口_webservice接口的开发和调用
- HMC5883L 磁力计校准
- ubuntu显卡测试软件,Linux显卡性能测试程序Unigine Valley 和 Unigine Heaven
- matlab怎么导入程序出错,Matlab导入数据时出错!十分困扰!
- iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...
- 基于BP神经网络的车牌识别问题研究附Matlab代码
- spring定时任务总结
- 读取csv时中文乱码问题
- 《从零开始的RPG游戏制作教程》第二期:让勇者和怪物登场