【发布时间】: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