[转载] Python multiprocessing 多进程进度条demo

之前氵了几篇
➡️ 两个python多进程的模板:
https://blog.csdn.net/HaoZiHuang/article/details/127267686
可以极大提升生产力

➡️ 但是进程间有共享变量怎么办呢?
https://blog.csdn.net/HaoZiHuang/article/details/127494251
借助 Manager 类可以创建共享 list 和 dict,但是对速度的影响较大 (至少我当前版本和遇到的问题是这样hhh)

➡️ 有时候遇到多进程程序不运行怎么办?排查指南
https://blog.csdn.net/HaoZiHuang/article/details/128010172
上文也转载了大佬的文章:
https://www.7forz.com/3408/
➡️ 多进程间共享内存怎么用,甚至可以使用 numpy 数组

➡️ 有时候我不需要进程池,我只需要一个临时的进程怎么办?
https://blog.csdn.net/HaoZiHuang/article/details/124001774


本来以为整一个多进程的进度条,需要用共享变量呢:

这里有个共享变量的用法:
https://stackoverflow.com/questions/2080660/how-to-increment-a-shared-counter-from-multiple-processes

然而实际上只需要 tqdmpool.imap_unordered

from multiprocessing import Pool
import tqdm


# do_work = lambda x:2 # 注意无法序列化 lambda 表达式
def do_work(x):
    return x*x

if __name__ == "__main__":
    pool = Pool(processes=8)
    tasks = list(range(100000))
    for _ in tqdm.tqdm(pool.imap_unordered(do_work, tasks), total=len(tasks)):
        # print("\r%d"%_)
        pass

以上demo程序摘自:
https://stackoverflow.com/questions/5666576/show-the-progress-of-a-python-multiprocessing-pool-imap-unordered-call

这里再说一下一下几者的区别与联系
imapmapimap_unorderedmap_async


  • imap 返回一个迭代器,有一个进程算出来一个结果,它返回一个,所以可以显示进度
  • map 会等所有的结果都完成之后统一返回

imapimap_unordered 都会立即返回结果

  • 使用imap,进程完成他的任务之后就立即返回结果,但是会保留输入的顺序
  • 使用imap_unordered,无论输入的顺序如何,只要有进程完成任务,就会立即返回结果,所以显示进度条的话用这个而不是 imap

mapmap_async 的主要区别就是是否会阻塞主进程:

map 是会阻塞主进程,会停在 pool.map 那一步

import time
from multiprocessing import Pool as mp

def run(num):
    print('PROCESS {} starts'.format(num))
    if num == 0:
        time.sleep(5)
    print('PROCESS {} ends'.format(num))

if __name__ == '__main__':
    print('start')
    pool = mp(5)
    num_list = [0, 1, 2]
    pool.map(run, num_list)
    print('阻塞~~~~')
    pool.close()
    pool.join()
    print('end')

map_async 是不会阻塞主进程,不会停在 pool.map_async 那一步

import time
from multiprocessing import Pool as mp

def run(num):
    print('PROCESS {} starts'.format(num))
    if num == 0:
        time.sleep(5)
    print('PROCESS {} ends'.format(num))

if __name__ == '__main__':
    print('start')
    pool = mp(5)
    num_list = [0, 1, 2]
    pool.map_async(run, num_list)
    print('非阻塞~~~~')
    pool.close()
    pool.join()
    print('end')

以上程序转载自:
https://testerhome.com/topics/18476

有参考自:
https://miraachan.github.io/2018/11/20/20/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值