【问题标题】:Repeatedly run a function in parallel重复并行运行一个函数
【发布时间】:2019-08-21 05:22:57
【问题描述】:

如何并行重复运行一个函数?

例如,我有一个不带参数且具有随机元素的函数。我想多次运行它,下面使用for 循环进行说明。请问我该如何并行完成?

import numpy as np

def f():
    x = np.random.uniform()
    return x*x    

np.random.seed(1)    
a = []
for i in range(10):
    a.append(f())

这是parallel-python-just-run-function-n-times 的副本,但是,答案不太合适,因为它将不同的输入传递给函数,How do I parallelize a simple Python loop? 还提供了将不同参数传递给函数而不是重复相同调用的示例.

我在 Windows 10 上并使用 Jupyter


关于我的实际用途:

每次调用是否会产生大量输出?
循环的每次迭代都会产生一个数字。

您需要保留输出吗?每次调用大概需要多长时间?
是的,我需要保留这些数字,每次迭代大约需要 30 分钟。

?您总共需要运行多少次?
至少 100 个。

您想跨多台机器并行化还是仅跨多个内核并行化?
目前只是跨多个内核。

【问题讨论】:

  • 每次调用是否产生大量输出?你需要保留输出吗?每次调用大约需要多长时间?您总共需要运行多少次?您是要跨多台机器并行化还是只需要多核并行化?
  • 嗨@MarkSetchell;我已经编辑了更多细节。谢谢
  • 是否涉及IO操作?计算量大吗?
  • 嗨@Marat;不,没有 IO 开销,也没有大的内存需求。这是一个优化/调度任务。
  • 仍然,计算量大吗?重要的是要知道区分线程池和进程池,并了解其中有多少可以并行执行。

标签: python parallel-processing


【解决方案1】:

如果您不想将任何输入传递给函数,只需使用 Throwaway 变量 _ 作为函数的参数并将其并行化,如下面的代码所示。

import numpy as np
from multiprocessing.pool import Pool

def f(_):
    x = np.random.uniform()
    return x*x

if __name__ == "__main__":
    processes = 5   # Specify number of processes here 
    p = Pool(processes)
    p.map(f, range(10))

更新: 要回答您更新的问题,如果您的任务不是太重并且只是 I/O 绑定,那么我建议您使用 ThreadPool(多线程)而不是 Pool(多处理)

创建Threadpool的代码:

from multiprocessing.pool import ThreadPool

threads = 5
t = ThreadPool(threads)
t.map(f, range(10))

【讨论】:

  • 您可以通过多处理队列将结果传回。
  • 或使用concurrent.futures 并在完成后获取Future 结果。
猜你喜欢
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多