【问题标题】:Implementing Multiproccessing on multi return functions在多返回函数上实现多进程
【发布时间】:2019-10-22 02:37:42
【问题描述】:

我对 python 还很陌生(而且堆栈溢出!),我从未使用过多处理。我目前有一个返回两个值的函数。这些值附加到不同的列表中。该函数有多个必需参数,其中一个来自 for 循环,请参见下面的示例代码。

代码有效,但功能很慢。我想为这个任务实现 MultiProcessing,但是我似乎无法让它基于一个池工作,因为我得到了多个返回值。

for x in list1:
    (a, b) = function(x, y, z)
    if a is not None:
        list2.append(a)
    if b is not None:
        list3.append(b)

有人有什么建议吗?

【问题讨论】:

  • 您能否发布导致您的代码失败/产生不良结果的 MP 代码?请注意,没有一个函数真的有多个返回值;您的函数返回一个 single 对象(我猜是您的元组),您将其解压缩为多个值。这在使用 MP 时不会引起任何问题。
  • 感谢您的评论 - 我写的所有内容似乎都回到了基本地图:(a,b) = p.map(function(x, y, z), range(len(list1))) 然而,这缺少实际的列表值。当我将其放回 for 循环时:for x in list1: (a,b) = p.map(function(x, y, z), range(len(list1))) 我因缺少 itterables 而收到错误
  • 如果您想获得更详细的帮助,您可能应该在问题/cmets 中提供更准确的信息,例如p 是什么?我建议你看看:stackoverflow.com/help/minimal-reproducible-example
  • 谢谢我会做的,意识到我没有足够的信息但不想发布整个项目!
  • @LiamJordan 太多和太少一样糟糕

标签: python-3.x


【解决方案1】:

这看起来像一个embarrassingly parallel 问题,可以通过类似的方法来解决:

import multiprocessing

n_proc = multiprocessing.cpu_count() + 1
pool = multiprocessing.Pool(processes=n_proc)
proc_results = [
    pool.apply_async(func, func_args, func_kwargs)
    for func, func_args, func_kwargs in
    zip(funcs, funcs_args, funcs_kwargs)]
results = [
    proc_result.get() for proc_result in proc_results]

或基于multiprocessingmap()starmap()的方法。


编辑

在你的情况下,代码:

for x in list1:
    a, b = function(x, y, z)
    if a is not None:
        list2.append(a)
    if b is not None:
        list3.append(b)

会变成:

import multiprocessing

n_proc = multiprocessing.cpu_count() + 1
pool = multiprocessing.Pool(processes=n_proc)
proc_results = [pool.apply_async(function, (x, y, z), {}) for x in list1]
for proc_result in proc_results:
    a, b = proc_result.get()
    if a is not None:
        list2.append(a)
    if b is not None:
        list3.append(b)

【讨论】:

  • 感谢您的回复和您的信息,我以前从未听说过这个词,但您是正确的,没有依赖关系。我是一个初学者,所以我花了一些时间来实现你的答案!但是,您的编辑使其更加清晰,谢谢。它似乎确实有效!即使我的代码有效,我也收到以下错误,这是我以前从未见过的,我将开始调试。如果您有任何想法,我将不胜感激,并感谢您的回复!原因:'TypeError("can't pickle _thread.lock objects")'
  • 很难说发生了什么,但看起来function() 的参数无法正确腌制。参见例如stackoverflow.com/questions/7865430/…
  • 感谢您在此问题上的帮助。我已经标记了我认为正确的答案。我有几个问题,我认为这些问题对于我的班级来说是独一无二的,我无法轻松地为其提供工作代码。该工具是一个交换机升级工具,可以在这里找到:github.com/lsjordan/switch-upgrade-tool - 不幸的是,它依赖于网络硬件,但如果有人对多处理分支有任何意见,我将不胜感激!这是我的第一个公共项目,所以如果有问题请告诉我。 @norok2
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2015-09-14
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多