【问题标题】:How do I adapt my code for multiprocessing如何调整我的代码以进行多处理
【发布时间】:2020-11-09 23:33:18
【问题描述】:

每当我使用我的(其他)多处理代码时,它都可以正常工作,但就我在脚本完成方面的反馈而言,例如“已完成 5 / 10 个文件”,我不知道如何调整我的代码以适应返回计数。基本上我想修改下面的代码以允许多处理。

所以我用

file_paths = r"path to file with paths"
count = 0
pool = Pool(16)
pool.map(process_control, file_paths)
pool.close()
pool.join()

在函数count += 1 and return count结尾处的process_control中

我猜等价的代码会是这样的

def process_control(count, file_path):
    do stuff
    count += 1
    print("Process {} / {} completed".format(count, len(file_paths))
    return count


file_paths = r"path to file with paths" 
count = 0 
for path in file_paths:
    count = process_control(count, path)

类似的东西。我希望我的解释清楚。

【问题讨论】:

  • 在主进程中尝试使用 for 循环的“pool.imap”或“imap_unordered”(如果需要,可以在单独的线程中)。在循环中,您可以增加计数器并打印计数。

标签: python


【解决方案1】:

每个子流程都有自己的count 副本,因此他们所能做的就是跟踪该流程中的工作。计数不会针对所有进程进行汇总。但是父母可以进行计数。 map 等待所有任务完成,所以这没有帮助。 imap 更好,它会迭代,但它也保持顺序,因此报告仍然延迟。 imap_unordered with chunksize 1 是您的最佳选择。每个任务返回值(即使是None)都会立即返回。

def process_control(count, file_path):
    do stuff

file_paths = ["path1", ...]
with multiprocessing.Pool(16) as pool:
    count = 0
    for _ in pool.imap_unordered(porcess_control, file_paths,chunksize=1):
         count += 1
        print("Process {} / {} completed".format(count, len(file_paths))

关于chunksize 的注释。使用池是有成本的——每个工作项都需要发送到子流程并返回其值。这种来回的 IPC 相对昂贵,因此池将“分块”工作项,这意味着它将把许多工作项全部发送到一个给定的子进程,并且只有当整个数据块时该进程才会返回已经通过worker函数处理了。

当有许多相对较短的工作项时,这非常有用。但是假设不同的工作项需要不同的时间来执行。即使其他子进程已经完成,也会有一个高杆子进程仍在处理它的块。

对您的情况更重要的是,在块完成之前,结果不会发回父级,因此您无法获得实时的完成报告。

将 chunksize 设置为 1,子进程将立即返回结果以进行更准确的记帐。

【讨论】:

  • 为帮助干杯我已经查看了 chunksize,但我有点不确定它的作用。如果你不是太忙,你能不能对它的作用提供一个令人毛骨悚然的解释?
【解决方案2】:

对于简单的情况,@tedelaney 之前的回答非常好。

对于更复杂的情况,Value 提供共享内存:

from multiprocessing import Value

counter = Value('i', 0)

# increment the value
with variable.get_lock():
    counter.value += 1

# get the value.  Read lock automatically used
processes_done = counter.value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多