【发布时间】: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