【问题标题】:Python: apply_sync() and tqdm() printing new linePython:apply_sync() 和 tq​​dm() 打印新行
【发布时间】:2023-01-31 15:52:38
【问题描述】:

我有以下代码,其中有 2 个变量运行 2 个独立的池来处理一堆表,进度应该通过 tqdm 栏反映出来。我相信我已经做到了,但我现在的问题是有新的进度条行,进度为 0,我不知道它是从哪里来的。我究竟做错了什么?


代码

from multiprocessing import Pool, Manager
from tqdm import *
from collections import deque

pbar = tqdm(position=0)


def task(tables_started, right_list, left_list, current_table, process):
    if current_table not in tables_started:
        tables_started.append(current_table)
        if process == "left_process":
            left_list.append(current_table)
        else:
            right_list.append(current_table)
        # print(f"Starting {current_table} running on {process}.")
        return True
    else:
        return False


def return_callback(result):
    # global pbar
    # print(result)
    if result:
        # print("updating")
        pbar.update()
    else:
        # print("not updating")
        pass


if __name__ == '__main__':
    right_tables = deque()
    manager = Manager()
    for i in range(10):
        right_tables.append("Table" + str(i))

    left_tables = right_tables.copy()
    left_tables.reverse()
    # print(left_tables)
    # print(right_tables)

    tables_started = manager.list()
    right_list = manager.list()
    left_list = manager.list()

    left_pool = Pool(processes=2)
    right_pool = Pool(processes=2)
    print(f"left_tables: {left_tables}")
    print(f"right_tables: {right_tables}")
    pbar.total = len(left_tables)
    while left_tables:
        left_table = left_tables.pop()
        left_res = left_pool.apply_async(task, (tables_started, right_list, left_list, left_table, "left_process"), callback=return_callback)
        right_table = right_tables.pop()
        right_res = right_pool.apply_async(task, (tables_started, right_list, left_list, right_table, "right_process"), callback=return_callback)
    
    left_pool.close()
    right_pool.close()

    left_pool.join()
    right_pool.join()

    # print(f"right_list: {right_list}")
    # print(f"left_list: {left_list}")

结果terminal screenshot of result

【问题讨论】:

标签: python python-multiprocessing tqdm apply-async


【解决方案1】:

以下代码有效:

from multiprocessing import Pool, Manager, freeze_support
from tqdm import *
from collections import deque

def work(tables_started, right_list, left_list, current_table, process):
    if current_table not in tables_started:
        tables_started.append(current_table)
        if process == "left_process":
            left_list.append(current_table)
        else:
            right_list.append(current_table)
        # print(f"Starting {current_table} running on {process}.")
        print("updated")
        return True
    else:
        print("didn't update")
        return False


def return_callback(result):
    # global pbar
    # print(result)
    if result:
        # print("updating")
        pbar.update()
            # pbar.close()
    else:
        # print("not updating")
        pass


if __name__ == '__main__':
    freeze_support()
    right_tables = deque()
    manager = Manager()

    for i in range(10):
        right_tables.append("Table" + str(i))

    left_tables = right_tables.copy()
    left_tables.reverse()
    # print(left_tables)
    # print(right_tables)

    tables_started = manager.list()
    right_list = manager.list()
    left_list = manager.list()

    left_pool = Pool(processes=2)
    right_pool = Pool(processes=2)
    print(f"left_tables: {left_tables}")
    print(f"right_tables: {right_tables}")
    pbar = tqdm(total = len(left_tables), position=0)
    while left_tables:
        left_table = left_tables.pop()
        left_res = left_pool.apply_async(work, (tables_started, right_list, left_list, left_table, "left_process"), callback=return_callback)
        right_table = right_tables.pop()
        right_res = left_pool.apply_async(work, (tables_started, right_list, left_list, right_table, "right_process"), callback=return_callback)

    left_pool.close()
    right_pool.close()
    left_pool.join()
    right_pool.join()

    # print(f"right_list: {right_list}")
    # print(f"left_list: {left_list}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多