Maison > développement back-end > Tutoriel Python > Un générateur asynchrone alternatif en Python

Un générateur asynchrone alternatif en Python

Mary-Kate Olsen
Libérer: 2025-01-04 16:47:39
original
456 Les gens l'ont consulté

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())
Copier après la connexion
$ python alternating_generator.py 
3
5
13
15
23
25
35
45
55
65
75
85
95
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal