10.1 AsyncIterator
Asynchronous iterators (AsyncIterator)
let you work with sequences of data that produce elements asynchronously. They're used in async functions and coroutines to iterate over data that might be fetched with some delay, like from network requests, async I/O operations, or other async sources.
Async Iterator
An async iterator must implement two methods:
The __aiter__()
method:
This method should return the async iterator itself. It's similar to the __iter__()
method for synchronous iterators.
The __anext__()
method:
This method should return the next value asynchronously or raise a StopAsyncIteration
exception if there are no more elements. It's similar to the __next__()
method for synchronous iterators.
Example:
import asyncio
class AsyncIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __aiter__(self):
return self
async def __anext__(self)(self):
if self.current >= self.end:
raise StopAsyncIteration
await asyncio.sleep(1) # Simulating async delay
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
Asynchronous iterators allow processing data as it comes in, without blocking other tasks. This is especially useful for dealing with network requests and other asynchronous operations.
Using asynchronous iterators helps write more readable and maintainable code for processing data sequences asynchronously.
10.2 AsyncGenerator
Asynchronous generators allow producing values asynchronously using the keywords async
and await
. They work similarly to regular generators but can pause execution to perform asynchronous operations.
Creating an Asynchronous Generator
An asynchronous generator is defined using async
def
and yield
. Async generators can use await
inside for performing asynchronous operations.
Example:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Async delay
yield i # Yielding value
Using an Asynchronous Generator
Asynchronous generators are used inside async functions with the async for
statement.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
Asynchronous generators improve code readability and maintainability, allowing the use of a simple syntactic structure async for
for working with asynchronous sequences.
GO TO FULL VERSION