Skip to content

zloop

An asyncio event loop with a Zig core - a drop-in, faster-than-uvloop alternative.


Documentation: you are reading it 🙂

Source Code: https://github.com/Kludex/zloop


zloop is an asyncio event loop whose engine is written in Zig. It is to asyncio what uvloop is: a drop-in replacement for the default event loop that you can use without changing your application code.

The difference is what's underneath. uvloop wraps libuv from Cython; zloop is a hand-written kqueue/epoll reactor in Zig, bound to CPython through a thin adapter.

The key features are:

  • Drop-in: it's a normal asyncio.AbstractEventLoop. For the common server/client workloads - TCP, TLS, Unix sockets, the streams and transport APIs - your code runs unchanged. (A few rarely-used loop APIs aren't implemented yet; see Compatibility.)
  • Fast: on the benchmarks we've run so far, faster than uvloop at scheduling, timers, and small/medium-message socket throughput. See Performance.
  • Familiar: works the same way uvloop does, so the tools you already know (uvicorn, AnyIO, FastAPI) just pick it up.
  • Tested: it passes uvicorn's entire test suite, plus its own suite at 100% coverage.

Installation

$ pip install zloop

Requirements

zloop needs CPython 3.12+ and runs on macOS / BSD (kqueue) and Linux (epoll).

Example

Let's create the simplest possible thing: run a coroutine on zloop.

main.py
import asyncio

import zloop


async def main():
    print("Hello from a Zig event loop 👋")


asyncio.run(main(), loop_factory=zloop.new_event_loop)  # (1)!
  1. This is the one line that matters. loop_factory tells asyncio.run() which loop to build - and zloop.new_event_loop builds a zloop one.

    Everything else is plain asyncio. That's the whole point.

Run it:

$ python main.py

Hello from a Zig event loop 👋

That's it. The coroutine ran, but the loop driving it - the timers, the callback scheduling, the I/O polling - was all Zig. 🎉

Python 3.12+

These docs use asyncio.run(..., loop_factory=...), which needs Python 3.12+. On 3.10 / 3.11 the loop works the same - you just start it differently; First steps shows how.

Where to go next

  • First steps


    The 30-second tour: how to actually plug zloop into your program.

  • Servers & clients


    The most common reason to use zloop. One CLI flag.

  • Architecture


    How a Zig reactor becomes a Python event loop, with diagrams.

  • Performance


    The benchmarks, the methodology, and the honest caveats.