Python bindings for async file I/O on Linux and a pure-Python/thread fallback for other platforms.
Three backends are available:
| Backend | Kernel | Notes |
|---|---|---|
linux_uring |
≥ 5.6 | io_uring - shared ring buffers, zero-syscall completions |
linux_aio |
≥ 4.18 | kernel AIO (io_submit / io_getevents), O_DIRECT only |
thread_aio |
any | pthreads pool, portable |
python_aio |
any | pure Python, no C extension required |
import asyncio
from caio import AsyncioContext
loop = asyncio.get_event_loop()
async def main():
# max_requests=128 by default
ctx = AsyncioContext(max_requests=128)
with open("test.file", "wb+") as fp:
fd = fp.fileno()
# Execute one write operation
await ctx.write(b"Hello world", fd, offset=0)
# Execute one read operation
print(await ctx.read(32, fd, offset=0))
# Execute one fdsync operation
await ctx.fdsync(fd)
op1 = ctx.write(b"Hello from ", fd, offset=0)
op2 = ctx.write(b"async world", fd, offset=11)
await asyncio.gather(op1, op2)
print(await ctx.read(32, fd, offset=0))
# Hello from async world
loop.run_until_complete(main())from caio import AsyncioContext picks the best available backend automatically
(linux_uring → linux_aio → thread_aio → python_aio).
To force a specific backend use the CAIO_IMPL environment variable:
CAIO_IMPL=uring python my_app.py # linux_uring
CAIO_IMPL=linux python my_app.py # linux_aio
CAIO_IMPL=thread python my_app.py # thread_aio
CAIO_IMPL=python python my_app.py # python_aioOr import a backend directly:
# io_uring (Linux ≥ 5.6)
from caio.linux_uring_asyncio import AsyncioContext
# kernel AIO (Linux ≥ 4.18)
from caio.linux_aio_asyncio import AsyncioContext
# thread pool
from caio.thread_aio_asyncio import AsyncioContextA default_implementation file placed next to caio/__init__.py (useful for
distro package maintainers) may contain one of uring, linux, thread, or
python on its first non-comment line.
Containers (Docker, Podman, Kubernetes) often block io_uring via a seccomp
filter. The import will raise ImportError with a diagnostic message if
io_uring_setup(2) returns ENOSYS.
Fix:
# Docker / Podman
docker run --security-opt seccomp=unconfined ...
# Kubernetes
securityContext:
seccompProfile:
type: Unconfinedlinux_aio requires kernel ≥ 4.18 and a compatible filesystem. If it does
not work in your environment you can fall back to thread or python:
CAIO_IMPL=thread python my_app.py