ホームページ >バックエンド開発 >Python チュートリアル >Python の代替非同期ジェネレーター

Python の代替非同期ジェネレーター

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-04 16:47:39441ブラウズ

An Alternating Asynchronous Generator in Python

from asyncio import run, sleep

class AlternatingGenerator:
    def __init__(self, gen1, gen2):
        self.gen1 = gen1
        self.gen2 = gen2
        self.next = gen1

    def __aiter__(self):
        return self

    async def __anext__(self):

        # if we are done we both generators
        if not self.gen1 and not self.gen2:
            raise StopAsyncIteration

        try:
            # saving the current generator into a variable for later
            current = self.next

            # if the other genrerator is not null, alternating to it for the next iteration
            if self.next is self.gen1 and self.gen2:
                self.next = self.gen2
            elif self.next is self.gen2 and self.gen1:
                self.next = self.gen1

            # calling the generator of the current iteration and returning the next result
            return await anext(current)

        except StopAsyncIteration:

            # unsetting the generator that just finished
            if current is self.gen1:
                self.gen1 = None
            else:
                self.gen2 = None

            # recursive call, trying again with the other generator
            return await self.__anext__()



async def three():
    for i in range(3, 31, 10):
        await sleep(0.25)
        yield i


async def five():
    for i in range(5, 101, 10):
        await sleep(0.25)
        yield i

async def main():
    gen = AlternatingGenerator(three(), five())

    try:  # or just use "async for item in gen:"
        while True:
            print(await anext(gen))
    except StopAsyncIteration:
        pass

if __name__ == '__main__':
    run(main())
$ python alternating_generator.py 
3
5
13
15
23
25
35
45
55
65
75
85
95

以上がPython の代替非同期ジェネレーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。