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中文网其他相关文章!