资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Python

python进程池之创建子任务的函数总结

Python 更新时间: 发布时间: 计算机考试归档 最新发布

python进程池之创建子任务的函数总结

 

目录

map

apply

map_async和apply_async

imap和imap_unordered

starmap和starmap_async


    

        python多进程标准库multiprocessing通过进程池启动多进程有以下几种方式,本文旨在说明这几种方式的区别:map、apply、map_async、apply_async、imap、imap_unordered、starmap、starmap_async。

map

map函数签名:map(func, iterable[, chunksize])

        从函数签名来看,map会自动将func函数依次应用在iterable中的每个参数上,从而会产生多个并行的func任务,同时有多少个任务在并行取决于在创建进程池时指定了多少个进程。map的多个子任务中,一旦有一个出现了异常,那么所有的结果将无法获取,但是其他子任务会正常运行(如果chunksize不为1,那么以chunk为单位,某个chunk出现异常,该chunk会立即停止,但其他chunk会正常运行,只是依然无法获取结果)。

        如果map函数设置了chunksize,那么map会把iterable参数进行等分,每份的大小等于 chunksize,需要注意的是,每个chunk会分配给一个进程顺序执行,这可能导致进程池中某个进程实际上已经处理完自己的chunk处于闲置状态了,但是并不能获取其他进程还未处理完的chunk中的任务,导致这些提早结束的进程处于闲置状态,浪费资源。当然,如果不设置chunksize参数,那么默认是对iterable中的参数逐个处理,即chunksize等于1,这样一旦有进程处理完某个任务后,会立即获取下一个参数继续处理,不会处于闲置状态;但是这样的缺陷就是,如果iterable参数过长,会导致频繁的给进程切换上下文,降低效率,而设定chunksize将参数一次传给进程可以避免频繁切换。

        iterable参数过长还可能造成内存消耗过大,因为map会一次性把iterable对应的多个子任务得到的结果保存在一个list中,这样内存中会保存一个很长的list,可能会过多消耗内存。这种情况下,可以使用下面的imap/imap_unordered,再结合chunksize参数,可以显著提升效率。

apply

apply函数签名:apply(func[, args[, kwds]])

        apply只是将func函数作为一个任务添加到进程中并执行,args和kwds是可选的传给func的位置参数和关键字参数,该函数每次只能运行一个任务,结束了之后才能运行下一个任务,因此,apply实际上并不能利用子进程进行多任务并行。     

map_async和apply_async

map_async函数签名:map_async(func, iterable[, chunksize[, callback[, error_callback]]])

apply_async函数签名:apply_async(func[, args[, kwds[, callback[, error_callback]]]])

        相比于map和apply,这两个函数不会阻塞主进程。如果在程序中,想要阻塞进行直至任务执行结束,那么可以调用pool的join方法,该方法会阻塞子进程直至所有任务结束;要注意的是,在调用join方法之前,需要先调用pool的close方法,表示任务添加完毕,这样join才被允许调用。

        这两个函数都会返回AsyncResult对象,AsyncResult对象的get函数可以获取运行结果。对于map_async函数,AsyncResult对象的get函数得到的是一个包含了多个任务运行结果的列表,而且结果的顺序和输入的iterable顺序一致。对于apply_async,其对应的AsyncResult的get函数返回的就是func函数返回的结果。

        AsyncResult的get函数会阻塞主进程,直至子进程的任务全部执行完。即map_async(func,iterable).get()等效于map(func,iterable),apply_async(func,args).get()等效于apply(func,args)。

imap和imap_unordered

        imap是map的lazy版本,即不会一次性的生成所有子任务的结果并存在一个list中返回,而是返回一个迭代器,等主进程主动迭代,再返回结果供进一步处理,而不是等所有子任务的结果全部生成后再处理,这样可以大大减少内存使用;对于iterable较长的情况,结合chunksize的合理使用,其相比map可以显著提升效率。

        但是imap有一个问题是,迭代器返回的结果是保序的,即,尽管iterable参数中,比较靠后的参数对应的子任务已经完成可以返回结果供下一步处理,但是如果第一个参数对应的任务耗时较久,那么主进程还是会继续阻塞,无法先处理已经先生成的结果。该迭代器只会按顺序的迭代,并且只有等到迭代到参数对应的子任务完成后,才会进行下一步,不然会继续阻塞。

        对于上述imap按顺序迭代获取结果带来的潜在的内存消耗以及cpu资源浪费问题,可以通过imap_unordered解决。imap_unordered相比于imap,其不要求迭代器保序,只要某个子任务结束返回了结果,迭代器就会立即准备好供主进程获取并进行下一步处理,而不会因为顺序迭代的原因阻塞在某个进程上。

starmap和starmap_async

        相比map和map_async,starmap和starmap_async唯一的区别就是要求iterable中的元素也是可迭代的,并将可迭代元素解包成多个位置参数传给func。即如果iterable是[(1,2),(3,4)],那么子任务分别是func(1,2)和func(3,4)。

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/990053.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【python进程池之创建子任务的函数总结】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2