【问题标题】:Error in use of multiprocessing module with generator using multiple yields使用多产量的生成器使用多处理模块时出错
【发布时间】:2019-03-28 10:34:03
【问题描述】:

有人可以帮我编写下面的代码吗,我正在尝试使用多处理实现具有多个产量的生成器。 对于生成器的第二次和第三次调用,我通常会使用next 后跟send,但我不确定这是如何使用多处理模块完成的。

from multiprocessing import Pool


def sq_divide(x, y):
    yield x**y
    send_receive = (yield x) #"send_receive" is used as confirmation that text "Done!!" was received

    if send_receive=="Done!!":
        yield x / y


if __name__ == "__main__":
    p = Pool(4)

    #first generator call
    n = p.map(sq_divide, (range(1, 10), range(1, 10)))
    print(n)

    #second generator call
    n = p.map(next, n)

    #last generator call
    n = p.map(n.send, "Done!!")
    print(n)

我的预期输出是:

first print:
[1, 4, 9, 16, 25, 36, 49, 64, 81]

second print:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

third print:
[1, 1, 1, 1, 1, 1, 1, 1, 1]

【问题讨论】:

  • 我不认为你正在尝试做的事情可以那样做。使用多处理为每个进程创建生成器的副本,因此它不是真正共享的。
  • 有没有一种方法可以实现它与我实现它的方式不同但产生相同的输出? @Netwave
  • 嗯,有很多方法,例如将功能一分为二。你需要更详细一点。为什么需要这样?
  • 好吧,我写的代码是另一个的压缩版本。基本上,我需要生成器在不同阶段产生值。然后使用这些值,然后生成器必须从它停止的地方继续到下一个收益值。但是我需要快速处理对生成器的所有调用,因为我有一个 gif 正在运行(使用 Tkinter),并且我不希望它在生成器处理时停止/滞后。
  • 如果只为 gif 使用线程可能会更简单?我认为您解决问题的方法可能就是问题本身。

标签: python python-3.x generator python-multiprocessing


【解决方案1】:

你在这里骑错了马。池工作者应该接收一些输入数据来完成一项工作,返回他们的输出并处理一个新任务。在这里,工作人员返回不可拾取的生成器对象,因此出现错误。但更根本的是,生成器必须一直存活到耗尽为止,因此在池工作进程中没有任何意义。

选项:

  • 使用一个后台线程/进程来管理所有生成器,而主线程/进程将处理 UI 部分
  • 在具有较长生命周期的一组线程/进程(不是来自池)上调度生成器(直到所有生成器都耗尽)

选择实际上取决于生成器可能遇到的瓶颈

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2010-11-24
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多