Python多进程实现

发布时间 2023-11-14 00:25:54作者: GEOLI

通过for循环批量处理数据是很常见的需求,但是当处理流程复杂时,一个一个按顺序去处理会十分缓慢。那么由于Python的多线程一直因为GIL锁的原因不太好用。因此多进程是前辈都推荐的一个办法,但是网上的多进程实现多如牛毛,遵循奥卡姆剃刀原则,这里介绍一个代码少又好用的多进程运行代码的办法:

正常来讲,我们按顺序处理代码的逻辑如下:

for i in filelist:
    worker(i)

接下来,我们仅需要引入ProcessPoolExecutor库,并使用Map函数,进行多进程提取:

from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
    executor.map(worker, iter(filelist), chunksize=4)

ProcessPoolExecutor将可迭代对象分割成许多块,并将其作为单独的任务提交给池。这些块的(近似)大小可以通过将chunksize设置为正整数来指定。默认大小是1,使用较大的chunksize值可以显著提高性能,同时也占用更多资源。

需要注意的是,在使用上述多进程方式时,如果worker函数内部有bug,那么程序会直接终结,编译器不会报任何错误,我一般的解决办法是,1.在进行多进程之前,在for循环中跑一下worker()函数,反正就一行代码的问题,很好改;2. 用print或logging的方式查看进度,看输出的结果是否正确。