首页 > 解决方案 > 有没有办法从 python3 中的 multiprocessing.Pool() 工作人员更新和打印到单个 tqdm 进度条?

问题描述

multiprocessing.Pool().starmap()用来处理在运行时动态导入的模块中的函数。这些函数中的每一个实际上都运行一个 R 脚本,我想在tqdm完成运行脚本时更新进度条,而不是在我将工作人员分配给给定输入时。我还想打印带有tqdm.write()或类似内容的消息以提供更新,而无需以奇怪的方式与进度条交互。我尝试了一个全局类,但我认为它是进程间通信的问题。这是我到目前为止所尝试的:

# main.py
import globals
import multiprocessing

# ...

if (whatever):
    import random_module

# ...

multiprocessing.Pool(4).starmap(random_module.run, parameters)

# ... 
# global.py
import tqdm.tqdm as tqdm
progbar = tqdm()
# random_module.py
import globals

def run(parameters):
    result = # do some R script with subprocessing
    globals.update(1)
    globals.write('processed parameter: ' + paramaters)
    return result

外部功能是一种伪编码(示例过于复杂),但 tqdm 部分基本上是我所拥有的。确实,我需要一种进程安全的方式来向主进程发出信号,表明我完成了我需要做的事情,但无需处理管道或其他高开销进程消息传递。谢谢!

标签: pythonpython-3.xpython-multiprocessingtqdm

解决方案


推荐阅读