【问题标题】:How to parallize/multithreading multiple generator initialization?如何并行化/多线程多个生成器初始化?
【发布时间】:2021-02-06 22:13:54
【问题描述】:

我有多个生成器,它们需要一些时间进行初始化,然后每个生成器才能产生第一个结果。在我下面的代码示例中是一个示例。每个生成器需要 5 秒进行初始化。所以总时间是10s。 有没有办法初始化g1g2 并行?这样总的初始化时间只有5s?

from random import random
from time import sleep


def my_generator():
    sleep(5)
    for i in range(5):
        yield random()

# this is what I want to do in parallel
g1 = my_generator()
g2 = my_generator()

x = [(r1, r2) for r1, r2 in zip(g1, g2)]

【问题讨论】:

  • 在那五秒钟内到底发生了什么?您是在等待外部事件还是 URL?您的代码是否处理复杂的计算?生成器是完全独立的,还是它们生成的值取决于其他正在进行的状态?所有这些都会影响答案。
  • @FrankYellin 生成器是独立的。初始化时间长的主要部分是由于大数据导致的数据库请求。计算很复杂
  • 听起来像this 可能对你有用。
  • @Darkonaut 非常感谢你,但实际上这并不完全是我所需要的。问题是我必须保留生成器的产量顺序。我必须同时处理g1g2 的响应。我想如果上面的例子可以并行执行,我的问题就解决了
  • 我不确定我是否真的理解你的意思,但你可以尝试使用this 来实现真正的并行。只需注释掉results.sort() 并使用您的示例调用应该是list(parallel_gen(gen_func=my_generator, gen_args_tuples=[()] * 2)])。但是你会在收益期间为 IPC 付出代价。

标签: python multithreading parallel-processing generator


【解决方案1】:

我找到了一个异步解决方案:

import asyncio
from random import random
from aiostream import stream

async def my_generator():
    await asyncio.sleep(5)
    for i in range(5):
        yield random()

async def main():
    combine = stream.zip(my_generator(), my_generator())
    x = []
    async with combine.stream() as streamer:
        async for item in streamer:
            x.append(item)
    print(x)

asyncio.run(main())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2021-08-29
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多