itertools and more for AsyncIO: aioitertools shadows the standard library whenever possible to provide asynchronous version of the modules and functions you already know. It’s fully compatible with standard iterators and async iterators alike, giving you one unified, familiar interface for interacting with iterable objects:
from aioitertools import iter, next, map, zip something = iter(...) first_item = await next(something) async for item in iter(something): ... async def fetch(url): response = await aiohttp.request(...) return response.json async for value in map(fetch, MANY_URLS): ...
On their own, AsyncIO and multiprocessing are useful, but limited: AsyncIO still can’t exceed the speed of GIL, and multiprocessing only works on one task at a time. But together, they can fully realize their true potential.
aiomultiprocess presents a simple interface, while running a full AsyncIO event loop on each child process, enabling levels of concurrency never before seen in a Python application. Each child process can execute multiple coroutines at once, limited only by the workload and number of cores available.
Gathering tens of thousands of network requests in seconds is as easy as:
async with Pool() as pool: results = await pool.map(<coroutine>, <items>)
Sqlite for AsyncIO: aiosqlite provides a friendly, async interface to sqlite databases, replicating the standard API while adapting and adding features to look and feel natural within modern, async codebases:
async with aiosqlite.connect(...) as db: await db.execute("INSERT INTO some_table ...") await db.commit() async with db.execute("SELECT * FROM some_table") as cursor: async for row in cursor: ...