将多处理模块与使用多个收益的生成器一起使用时出错

时间:2019-03-28 10:34:04

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

请提供一些我下面的代码,可以帮助我,我正在尝试使用多重处理实现具有多个收益的生成器。 我通常会在生成器的第二次和第三次调用中使用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]

1 个答案:

答案 0 :(得分:1)

您在这里骑错了马。池工作人员应该接收一些输入数据以完成工作,返回其输出并处理新任务。在这里,工人返回无法拾取的生成器对象,因此会产生错误。但是从根本上讲,生成器必须生存直到耗尽为止,因此在池工作进程中没有意义。

选项:

  • 使用一个后台线程/进程来管理所有生成器,而主要的一个将处理UI部分
  • 将生命周期长的线程/进程(不是从池中)分配给生成器(直到耗尽所有生成器)

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