问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ProcessPoolExecutor并行编程

发布网友 发布时间:2022-12-26 10:03

我来回答

1个回答

热心网友 时间:2023-10-15 10:20

你有个程序要执行CPU密集型工作,你想让他利用多核CPU的优势来运行的快一点。

concurrent.futures 库提供了一个 ProcessPoolExecutor 类, 可被用来在一个单独的Python解释器中执行计算密集型函数。 不过,要使用它,你首先要有一些计算密集型的任务。 我们通过一个简单而实际的例子来演示它。假定你有个Apache web服务器日志目录的gzip压缩包:

进一步假设每个日志文件内容类似下面这样:

下面是一个脚本,在这些日志文件中查找出所有访问过robots.txt文件的主机:

前面的程序使用了通常的map-rece风格来编写。 函数 find_robots() 在一个文件名集合上做map操作,并将结果汇总为一个单独的结果, 也就是 find_all_robots() 函数中的 all_robots 集合。 现在,假设你想要修改这个程序让它使用多核CPU。 很简单——只需要将map()操作替换为一个 concurrent.futures 库中生成的类似操作即可。 下面是一个简单修改版本:

通过这个修改后,运行这个脚本产生同样的结果,但是在四核机器上面比之前快了3.5倍。 实际的性能优化效果根据你的机器CPU数量的不同而不同。

ProcessPoolExecutor 的典型用法如下:

其原理是,一个 ProcessPoolExecutor 创建N个独立的Python解释器, N是系统上面可用CPU的个数。你可以通过提供可选参数给 ProcessPoolExecutor(N) 来修改 处理器数量。这个处理池会一直运行到with块中最后一个语句执行完成, 然后处理池被关闭。不过,程序会一直等待直到所有提交的工作被处理完成。

被提交到池中的工作必须被定义为一个函数。有两种方法去提交。 如果你想让一个列表推导或一个 map() 操作并行执行的话,可使用 pool.map() :

另外,你可以使用 pool.submit() 来手动的提交单个任务:

如果你手动提交一个任务,结果是一个 Future 实例。 要获取最终结果,你需要调用它的 result() 方法。 它会阻塞进程直到结果被返回来。

如果不想阻塞,你还可以使用一个回调函数,例如:

回调函数接受一个 Future 实例,被用来获取最终的结果(比如通过调用它的result()方法)。 尽管处理池很容易使用,在设计大程序的时候还是有很多需要注意的地方,如下几点:

一旦启动你不能控制子进程的任何行为,因此最好保持简单和纯洁——函数不要去修改环境。

它会克隆Python解释器,包括fork时的所有程序状态。 而在Windows上,克隆解释器时不会克隆状态。 实际的fork操作会在第一次调用 pool.map() 或 pool.submit() 后发生。

你应该在创建任何线程之前先创建并激活进程池(比如在程序启动的main线程中创建进程池)。
Python并行编程:subprocess、ProcessPoolExecutor

以计算列表元素0到每个元素值的平方和为例,ProcessPoolExecutor可以简化代码,实现并行计算。然而,对于性能要求极高(如100us级别)的应用,Python可能不是首选语言,因为其他语言可能更适合处理这类高并发场景。总的来说,Python并行编程需结合subprocess和ProcessPoolExecutor等工具,但要注意GIL的限制。在实...

ProcessPoolExecutor并行编程

ProcessPoolExecutor 的典型用法如下:其原理是,一个 ProcessPoolExecutor 创建N个独立的Python解释器, N是系统上面可用CPU的个数。你可以通过提供可选参数给 ProcessPoolExecutor(N) 来修改 处理器数量。这个处理池会一直运行到with块中最后一个语句执行完成, 然后处理池被关闭。不过,程序会一直...

python并行编程之Asyncio

接着,文章深入介绍了Python中的并发编程技术。多线程通过`thread`和`ThreadPoolExecutor`实现,允许在同一进程内创建多个线程来执行并行任务。而多进程则通过`subprocess`和`ProcessPoolExecutor`实现,每个进程拥有独立的地址空间,避免了线程间的资源竞争问题,适合于计算密集型任务。最后,文章聚焦于Python并行...

Future, ThreadPoolExecutor和ProcessPoolExecutor

ThreadPoolExecutor和ProcessPoolExecutor是Executor类的子类,分别使用线程池和进程池执行异步任务。ThreadPoolExecutor默认线程数为CPU核心数乘以5,适用于IO密集型工作,工作者数量通常多于ProcessPoolExecutor。ProcessPoolExecutor最多使用指定的最大进程数,若未指定默认为CPU核心数,且最大进程数不能为0,否则...

python中的asyncio使用详解与异步协程的处理流程分析

使用 concurrent.futures 下的 ThreadPoolExecutor 或 ProcessPoolExecutor 可在多线程或多进程中执行同步函数。注意它们在初始化时的 max_workers 参数决定执行器的工作线程数。异步函数的动态添加 使用 asyncio.run_coroutine_threadsafe() 可以将协程绑定到事件循环上,避免阻塞主线程。通过 gather() 方法...

Asyncio 异步编程模块-Python成为专业人士笔记

在Python云环境中,异步编程可以通过async函数和Executor来实现。例如,run_in_executor()使用Executor在异步任务中执行代码,ThreadPoolExecutor和ProcessPoolExecutor可用于线程池和进程池的调度。对于性能优化,uvloop是一个基于libuv的高性能事件循环,尽管Windows上暂时不可用,但在云环境下安装后,可以提供显著...

stk500并行编程 openmp并行编程 并行编程 实例 java并行编程 并行编程模式 深入理解并行编程 并行编程语言有哪些 并行编程模型 并行编程模型有哪几种
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
氰基硼氢化钠可以在醛酮的还原氨化中做还原剂,那硼氢化钠可以吗 怎样鉴别和田玉与阿富汗玉?-和田玉资讯 乌鸡红豆汤的热量是多少? 春季喝乌鸡汤加红豆红枣香姑好不好 天天喝一碗乌鸡红豆汤好吗 乌鸡红豆汤乌鸡红豆汤营养分析 香蕉和鸡蛋能一起吃么? 新余市半格娱乐有限公司怎么样? 海尔kfr-72lw/08dba22a 3匹柜式空调室内机出水离地多少 红茶和乌龙茶哪个减肥效果好 子的五行 子字的五行属性 子字五行属性 请问子字五行属什么。 导数的求法? 微信怎么开启/关闭视频号功能? 梦见朋友吃喝是什么意思 “绿油油”类似的词语和句子有哪些 八上英语第三单元语法点 凯洋电动轮椅充满了显示的应该是几格电 电动轮椅的电池能用多久 什么时候需要充电? 互邦充电轮椅怎么知道电已充满 电动轮椅电量指示灯3个绿灯 互帮电动轮椅没电了怎么显示 某个微机的数据总线的宽度为8位,地址总线为16位,那么它的寻址地址空间为 求过程 我以前买的无线座机坏掉了,去哪里可以维修呢? 座机屏摔烂能不能维修 跪求“明月几时有”的口琴谱 “批”和“批次”有什么区别? “批”和“批次”有什么区别? 往后余生有你相伴,该如何接句子 中间那个女人叫什么? 平安御享财富(2023)养老年金保险靠谱么? 摩卡婚礼摄影婚纱照相框选什么材质 《三行情书》 蔡文泽 你写过情书吗? 苹果12手机下载钉钉为什么需要密码 4g卡用5g手机接不了电话 高铁上f是靠窗还是走廊 苹果6p要最新更新系统才能下载微信 花蕾的别称和雅称 IPAD如何输入下划线? 二手玫瑰是什么梗 二手玫瑰算不算朋克 属兔的人适合养什么宠物 属兔适合养狗吗 集成墙饰价格一般多少 集成墙面厂家有哪些?有了解的吗? 规划同义词 卡尤迪采样管一盒有多少个 ()的花园 ()中能填什么 ?