【问题标题】:Print parallel progress bars for subprocesses in python map_async在 python map_async 中打印子进程的并行进度条
【发布时间】:2022-07-15 15:30:05
【问题描述】:

我有一个熊猫数据框列表。我想在我所有核心上的每个数据帧上并行运行一个 python 函数。我的函数如下所示:


from tqdm import tqdm

def f(df):
    for _, row in tqdm(df.iterrows, total=len(df)):
        # Do some processing
    
    return result


list_of_dataframes = [df1, df2, df3, df3]
ncores = 4
pool = Pool(ncores)
results = pool.map_async(f, list_of_dataframes)
pool.close()
pool.join()

但是,我没有看到在每个智利进程的输出中并行更新四个进度条。我看到只有一个栏得到更新,而且也来回移动。例如,它移动到 5%,然后再次移动回 2%。我相信这是由于所有进程都更新了同一个栏。

我尝试保持一个全局进度条并像这样在每个函数调用中更新它,但这不起作用。

from tqdm import tqdm 
from multiprocessing import Pool

list_of_dataframes = [df1, df2, df3, df4]
total_rows = len(df1) + len(df2) + len(df3) + len(df4)

def f(df):
    for _, row in df.iterrows():
        # Some processing
        pbar.update(1)
    return 1 

with tqdm(total=total_rows) as pbar: 
    list_of_dataframes = [df1, df2, df3, df3]
    ncores = 4
    pool = Pool(ncores)
    results = pool.map_async(f, list_of_dataframes)
    pool.close()
    pool.join()

但这也行不通。进度条的行为类似。有没有办法在上面的代码中锁定 pbar 变量,这样只有一个进程可以一次更新进度条,或者有什么方法可以并行显示 4 个进度条?

【问题讨论】:

  • 如果使用multiprocessing,它们将是单独的实例。您需要使用Value 使变量在进程之间通用。

标签: python-3.x locking python-multiprocessing tqdm


【解决方案1】:

您可以使用小型 parallelbar 库轻松完成您需要的工作。

例如

import pandas as pd
import numpy as np

from parallelbar import progres_map


def foo(df):
    for row in df.iterrows():
        #do something
        pass
    return 'done'

if __name__=='__main__':
    df_1 = pd.DataFrame(np.random.random((1000, 5)))
    df_2 = pd.DataFrame(np.random.random((1000, 5)))
    df_3 = pd.DataFrame(np.random.random((1000, 5)))
    df_4 = pd.DataFrame(np.random.random((1000, 5)))
    result = progress_map(foo, [df_1, df_2, df_3, df4])

您还可以找到更多详情here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多