python 多进程下tqdm如何显示进度条

python 多进程下tqdm如何显示进度条

问题

fastnlp dataset的apply方法增加多进程处理功能时遇见这个问题:多进程下显示所有子进程的进度条,主进程显示总进度条。

解决方法

解决思路

主要思路是采用管道通信(pipe)功能来实现子进程和主进程的交流。由于使用python的multiprocess开启进程池后主进程会阻塞,故只能在主进程中开辟一个线程来不断收集子进程的处理进度并显示;其好处是当主进程阻塞后,线程便不需要跟主进程争用处理机,其一直占用cpu资源。
这里有个小知识点是multiprocessing和multiprocess的区别,multiprocessing不能使用匿名函数作为进程池的传入参数,而multiprocess支持匿名函数。这是因为multiprocessing使用pickle作为序列化的库,但pickle不支持匿名函数;而multiprocess使用dill库作为序列化的函数,其支持匿名函数的序列化,故能使用lambda函数。fastnlp采用的是multiprocess。

总进度条和子进度条显示

图1
定义_process_bar函数,收集子进程的处理进度情况并更新总进度条。
图2
定义子进程的函数_apply_single,内部使用了tqdm来展示子进程的进度条;使用管道pipe与主进程交流。最新版的fastnlp默认不显示子进程的进度条。
在这里插入图片描述
上图为fastnlp dataset中的apply方法中多进程处理数据集的部分代码;首先对数据集进行切分,使用multiprocess库开辟管道,再启动线程运行_process_bar函数来显示总的进度条;然后开启进程池处理数据,其中子进程使用tqdm库自带的递归锁RLock()互斥显示进度条。最后分别将进程池和线程阻塞即可。

在这里插入图片描述
最终效果如图所示,fastnlp默认不展示子进程进度条,其显示结果只有Main这个进度条,减少打印的内容量。
具体代码可以见fastnlpv8

Python中,可以使用`multiprocessing`模块来实现多进程编程。而要在多进程中同时使用`tqdm`来显示进度条,可以采用以下步骤: 首先,导入所需的模块和函数: ```python from multiprocessing import Pool from tqdm import tqdm ``` 然后,定义一个要在多进程中执行的函数,例如`run_task`: ```python def run_task(arg): # 这里是要执行的任务代码,可以根据实际情况进行修改 return arg * arg ``` 接着,定义一个函数来初始化进程池,并使用`tqdm`来显示进度条: ```python def main(): # 定义进程池大小 pool_size = 5 # 定义要处理的任务数量 task_count = 10 # 初始化进程池 pool = Pool(pool_size) # 使用tqdm显示进度条 with tqdm(total=task_count) as pbar: # 使用imap函数在多个进程中执行任务 for result in pool.imap(run_task, range(task_count)): # 这里可以对result进行处理或输出 pbar.update(1) # 关闭进程池 pool.close() pool.join() ``` 最后,调用`main`函数来执行多进程编程并显示进度条: ```python if __name__ == '__main__': main() ``` 以上代码将使用`tqdm`库来显示进度条,同时使用`multiprocessing`模块实现多进程编程。其中,`pool_size`用于定义进程池的大小,`task_count`表示要处理的任务数量。在`for`循环中,通过`imap`函数在多个进程中执行任务,并在每次任务完成后更新进度条。 总结起来,使用Python的`multiprocessing`模块和`tqdm`库可以实现同时进行多个进程的任务并在处理过程中显示进度条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值