Skip to main content

Talyn: Robust, Stable AsyncIO Event Loop for Python

License Python Compatibility Linux Compatibility Zig Compatibility PyPI Version

Talyn is a robust, exceptionally stable, and realistically fast asyncio event loop drop-in replacement for Python, powered by the asynchronous capabilities of Zig and io_uring.

Talyn prioritizes correctness, complete system safety, and high usability over artificial micro-benchmark superiority. It is fully compatible with CPython's standard single-threaded and free-threaded (GIL-disabled) runtimes.


🚀 Features

  • Realistic Speed: Designed to deliver solid and reliable I/O performance on Linux by leveraging io_uring's native kernel-side asynchronous completion queues.
  • Robust & Crash-Resistant: Meticulously hardened against circular reference memory leaks, stack alignment faults, signal interrupt deadlocks, and use-after-free bugs.
  • Full Asyncio Compatibility: Passes 100% of standard Python asyncio, subprocess, transports, and connection-lifecycle test suites.
  • Offline AST Bug Hunter & Linter: Enforces strict invariant safety rules (preventing memory leaks, discarded syscalls, panics, and UAFs) via a built-in, sub-15ms Zig and Python AST static analyzer (zig build lint).
  • Modern Packaging: Fully migrated to PEP 517/518 standard declarative pyproject.toml configuration.
  • GIL-Disabled Free-Threading Ready: Fully compatible with python3.13t and python3.14t without memory races.

📜 Requirements

  • Python: >= 3.13 (Tested and verified under CPython 3.13, 3.14, 3.13t (free-threaded), and 3.14t (free-threaded))
  • Linux Kernel: >= 7.0 (Verified on Linux Kernel 7.0.x)
  • Zig Compiler (for source builds): 0.16.0 (Fedora packages)

[!NOTE] Tested Platform Verification: Talyn is primarily developed and tested under Fedora 44 on an x86_64 architecture equipped with an Intel(R) Core(TM) Ultra 7 265 processor. Since v0.8.7 we also build and verify aarch64 and riscv64 wheels on the same x86_64 host: the native extension is cross-compiled by Zig, and the full test suite is executed inside Fedora 44 QEMU VMs (see Linux Development below).


🔧 Installation & Testing

To compile and install Talyn locally on a native Linux machine, run:

pip install -e .

🍎 macOS Development & Testing via Podman (Apple Silicon)

Since Talyn is a Linux-only project leveraging io_uring, development and testing on macOS require running inside a Linux environment.

We provide a frictionless, automated setup using Podman and a Fedora 44 (AARCH64) container:

  1. Install Podman:
    brew install podman
    
  2. Initialize the Podman VM (only needed once):
    podman machine init
    
  3. Run the test suite (the script automatically starts the VM if it's stopped, builds the image, runs the tests with proper permissions, and stops the VM at the end if it started it):
    ./scripts/macos/run_tests.sh
    

You can pass any options supported by test_all.sh (e.g., --verbose or --python=3.13):

./scripts/macos/run_tests.sh --verbose --python=3.13

To force a rebuild of the Fedora testing image:

./scripts/macos/run_tests.sh --rebuild-image

📊 Benchmarking

We also provide a wrapper to run the benchmark suite inside the Fedora container using the optimized ReleaseFast target:

./scripts/macos/benchmark.sh --python=python3.13

You can target a specific benchmark using --bench (note that benchmark names with spaces must be quoted):

./scripts/macos/benchmark.sh --python=python3.13 --bench="task spawn"

The generated comparison plots will be automatically saved to benchmarks/output/.

📦 Building & Publishing Multi-Architecture Wheels

If you are developing on macOS (Apple Silicon) and need to build and publish wheels for both aarch64 and x86_64 architectures to PyPI, you can do so in a single command using Podman's emulation:

  1. Build all wheels: This script builds a native aarch64 container image and an emulated x86_64 container image, runs scripts/build.sh inside both, and collects all 8 wheels (4 Python versions × 2 architectures) in the ./dist/ directory:

    ./scripts/macos/build_all_wheels.sh
    
  2. Publish to PyPI: Upload the built distributions in ./dist/ using twine (pre-configured in your repository):

    ./scripts/publish.sh
    

🖥️ Linux (x86_64) Development: Build, Cross-Compile & Multi-Arch Testing

All of Talyn's development—including aarch64 and riscv64 wheels and full test-suite runs—can be done on an x86_64 (Intel) Linux PC, with no MacBook required:

  • Building: Zig is a native cross-compiler, so foreign-architecture wheels and the extension are produced at full host speed — no QEMU involved.
  • Testing: QEMU user-mode emulation (e.g. podman run --platform linux/arm64) cannot run Talyn, because io_uring_setup returns ENOSYS under user-mode emulation and Talyn requires io_uring with no fallback. Instead, we boot a full-system Fedora 44 VM per architecture, whose real guest kernel passes io_uring syscalls through to the host kernel.

📋 1. Fedora 44 required packages

Install Zig, all four Python interpreters with development headers, and the stdlib test suites:

sudo dnf install zig \
    python3.13 python3.13-devel python3.13-freethreading \
    python3.14 python3.14-devel python3.14-freethreading python3.14-freethreading-devel \
    python3.13-test python3.14-test python3.14-freethreading-test

Bootstrap pip and the test tooling for each interpreter:

for p in python3.13 python3.13t python3.14 python3.14t; do
    $p -m ensurepip --upgrade
    $p -m pip install --user pytest pytest-asyncio
done

For foreign-architecture VM testing (aarch64 / riscv64), additionally:

sudo dnf install qemu-system-aarch64 edk2-aarch64 qemu-system-riscv edk2-riscv64 \
    genisoimage openssh-clients

[!NOTE] python3.13-freethreading-test is not packaged for Fedora 44; the stdlib asyncio modules for the free-threaded 3.13 build are skipped automatically by the test suite.

🏗️ 2. Build all wheels natively (x86_64 + aarch64 + riscv64)

./scripts/linux/build_all_wheels.sh

Uses Zig's native cross-compiler — no QEMU needed. Produces 12 wheels (4 Python variants × 3 architectures) in ./dist/, ready for ./scripts/publish.sh.

🧪 3. Run the test suite natively (x86_64)

./scripts/test_all.sh                  # Debug build
./scripts/test_all.sh --starburst      # ReleaseFast build

🖥️ 4. Test foreign-architecture wheels in VMs

Boots a real Fedora 44 VM per architecture (first run downloads the ~0.5 GB cloud image to ~/.cache/talyn-*-vm/) and runs the full pytest suite against each installed wheel:

./scripts/linux/run_tests.sh                     # aarch64 wheels
./scripts/linux/run_tests.sh --arch=riscv64      # riscv64 wheels
./scripts/linux/run_tests.sh --smoke             # quick import + event-loop smoke test only
./scripts/linux/run_tests.sh --shutdown          # stop the VM after the run

⚡ 5. Run the full test_all.sh suite in VMs (cross-compiled, fast)

test_all.sh normally compiles the extension inside the VM, which is slow under QEMU TCG. Instead, cross-compile the four extension variants natively on the host (the same build flags the wheels use) and run test_all.sh --no-build in the VM:

./scripts/linux/run_test_all.sh --arch=aarch64 --starburst
./scripts/linux/run_test_all.sh --arch=riscv64 --starburst

Under heavy emulation, a stdlib module may exceed its per-module timeout (e.g. test_subprocess on riscv64); raise it with TALYN_STDLIB_TIMEOUT=600 and the memory-safety repro timeout with TALYN_REPRO_TIMEOUT=900.

🛡️ 6. Run the native Offline AST Linter & Bug Hunter

Talyn includes a zero-dependency static analyzer hooked into std.zig.Ast and Python's ast module to prevent regressions and enforce architectural safety rules in under 15ms:

zig build lint

For the complete catalog of rules, see docs/development/ast-linter.md.

⏱️ Measured timings

scripts/test_all.sh --starburst (4 Python variants: pytest suite + stdlib asyncio suite):

Environment Total time
x86_64 (native) 8m28s
aarch64 VM, in-VM build 42m33s
riscv64 VM, in-VM build 44m56s
aarch64 VM, cross-built (run_test_all.sh) 17m47s
riscv64 VM, cross-built (run_test_all.sh) 24m48s

All configurations pass the pytest suite; under QEMU TCG the emulated runs are ~5× slower than native, and the cross-built runs cut the in-VM build phase (~2.4× speedup on aarch64). An occasional stdlib-asyncio module may time out under heavy emulation (see note above about TALYN_STDLIB_TIMEOUT).

⚡ Optimization & Target Compilation (For Developers & Power Users)

By default, the pre-built wheels generated by build.sh are compiled targeting a generic x86_64 CPU architecture baseline to ensure 100% universal compatibility across all 64-bit modern x86 Linux processors (e.g., matching standard PyPI manylinux wheel compatibility).

Based on our benchmarks and comprehensive validation—including 100% passing results in the standard asyncio test suite across four distinct Python versions—we publish the official binary packages (wheels) compiled in Starburst mode (Zig built with ReleaseFast) to deliver peak performance out of the box with proven stability.

If you are compiling from source, you can customize the compilation optimize mode and target CPU architecture to unleash maximum performance:

1. Compile and Optimize for your Native CPU (Highly Recommended)

To compile Talyn so that it takes full advantage of your host's exact CPU instructions (such as AVX2, AVX-512, cache alignment, etc.):

# Omit TALYN_CPU so Zig defaults to native CPU optimization
TALYN_OPTIMIZE=ReleaseFast pip install .

2. Configure Compilation Modes

You can control Zig's optimize mode by setting the TALYN_OPTIMIZE environment variable (defaults to Debug for developer convenience):

  • TALYN_OPTIMIZE=Debug (Default): Compiles with heavy runtime assertions and debug symbols.
  • TALYN_OPTIMIZE=ReleaseSafe: Compiles with full optimizations but keeps safety checks (e.g. out-of-bounds, overflows).
  • TALYN_OPTIMIZE=ReleaseFast: Compiles with maximum optimizations (Starburst mode), disabling safety checks for peak execution speed.

3. Target a Specific CPU microarchitecture

You can force Zig to compile for a specific target CPU microarchitecture (like x86_64_v2 or x86_64_v3):

TALYN_OPTIMIZE=ReleaseFast TALYN_CPU=x86_64_v3 pip install .

📦 Usage

Basic Usage

To run a coroutine directly with the Talyn event loop:

import talyn
import asyncio

async def main():
    print("Hello from Talyn!")
    await asyncio.sleep(1)
    print("Goodbye from Talyn!")

# Run using Talyn event loop
talyn.run(main())

Graceful Fallback & Hardening Check

For production configurations, you may want to support fallback options. If Talyn is not installed, or if the host Linux kernel does not meet Talyn's safety baseline (monitored by the HARD-01 Kernel Version Guard which requires kernel >= 6.0), the code will gracefully fall back to uvloop (if available), and finally to standard Python asyncio:

import asyncio

# 1. Try to initialize Talyn (performs HARD-01 kernel version check)
try:
    import talyn
    talyn.install()
except (ImportError, RuntimeError):
    # 2. Fallback to uvloop if Talyn is missing or kernel version is too old
    try:
        import uvloop
        uvloop.install()
    except (ImportError, AttributeError):
        # 3. Fallback to standard Python asyncio (do nothing)
        pass

async def main():
    print("Running with the best available event loop!")

asyncio.run(main())

💝 Historical Credits & Origin

Talyn is spun off from Leviathan, an event loop originally pioneered by Enrique Mora. Enrique Mora's creative spark and vision of merging Zig, io_uring, and asyncio laid the critical foundation and architecture of this project.

As Talyn evolved, the implementation underwent a complete systems-level refactoring to transition from a theoretical prototype to a production-grade, crash-resistant runtime:

  • Eliminated multi-crossing Zig/Python vectorcall overhead by implementing a fused scheduler step trampoline in pure Zig.
  • Redesigned completion handlers into flat, GC-safe ring buffers.
  • Fully audited and resolved all memory-leak reference cycles under concurrent connections.

To honor the project's roots and Enrique's early work:


📖 Project Story

  • Development Journey — The full story: from discovery to challenges, the shift from "ultra-fast" to "realistic fast and stable", and how Talyn was built.
  • Why Talyn? — The personal story and meaning behind the new name.

📄 License

This project is licensed under the MIT License. See LICENSE.md for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

talyn-0.9.1-cp314-cp314t-manylinux_2_36_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.36+ x86-64

talyn-0.9.1-cp314-cp314t-manylinux_2_36_riscv64.whl (2.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.36+ riscv64

talyn-0.9.1-cp314-cp314t-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.36+ ARM64

talyn-0.9.1-cp314-cp314-manylinux_2_36_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ x86-64

talyn-0.9.1-cp314-cp314-manylinux_2_36_riscv64.whl (2.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ riscv64

talyn-0.9.1-cp314-cp314-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ ARM64

talyn-0.9.1-cp313-cp313t-manylinux_2_36_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.36+ x86-64

talyn-0.9.1-cp313-cp313t-manylinux_2_36_riscv64.whl (2.4 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.36+ riscv64

talyn-0.9.1-cp313-cp313t-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.36+ ARM64

talyn-0.9.1-cp313-cp313-manylinux_2_36_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ x86-64

talyn-0.9.1-cp313-cp313-manylinux_2_36_riscv64.whl (2.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ riscv64

talyn-0.9.1-cp313-cp313-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ ARM64

File details

Details for the file talyn-0.9.1-cp314-cp314t-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 b501c9d11a7e4ceb53337716d5a64c8cf853682117795599419b630e0fa65505
MD5 bef1c4fc43e4940ac00c47a543f5162a
BLAKE2b-256 82c982f84b052e51b714824fe055cfe0473c040e89cf44ea26629299b7e7ace3

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp314-cp314t-manylinux_2_36_riscv64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314t-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 2f4254f7dbdadc628d05c2fd12211f566e35192ffa7717c86ee77851f0f924de
MD5 6675ea2ce27be95cb74e310b161918a7
BLAKE2b-256 f80ab041dc659596a19a5c6fbf540165b20c63de889dc4ea5c44141fd401b17d

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp314-cp314t-manylinux_2_36_aarch64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 b95264ad3b07935230543985af4ef3ac110e496c978e344abe9323cbab351a6f
MD5 914078ba5ef7f4e160b086db378ed436
BLAKE2b-256 d69a1d69529aa46852e8faf076572cc8f0c8a49ce0f76b2073cab1ab39f78909

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp314-cp314-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 b0a0d9198c344129138e16f21a974e5bcf8983c2e884352c346d6d2a558c3f51
MD5 8b9f062b3b0d3fcbe96279061488297f
BLAKE2b-256 e98c23ac7f8f7e8cfa17405590c0cd51b786d11f9f25dae07b3e10493ec8a1db

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp314-cp314-manylinux_2_36_riscv64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 20f0f2c74fcc91d5a58c0bdd7ef2e2df769d02cb3630f183340f1e4ccaea9faf
MD5 5a06d8a621d06a31fbfc2faeb505e89b
BLAKE2b-256 e578591ece8baa3925fbf9d8559ebac1b76eb989e68cd899720743779578a66f

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp314-cp314-manylinux_2_36_aarch64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp314-cp314-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 365782b74baa9bf05a65b559e2eea23d08636a22f1f2e9ee55b1306dda8423e0
MD5 8cfa86ec8d959fb18f4ca2441089f253
BLAKE2b-256 c5758c0ef59470d452058b4abe8ffce49dfbef67aeba39cdda477246c1fb844b

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313t-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 a24bdfe6412eadf119a27d5e6af372567b78ea2f79ad3074929bbdc3907d8a08
MD5 694523c99e31d7f67d5cab62d5834d8f
BLAKE2b-256 6ccaa7bd9995465697ea4bbdbb384cce8cd317d1d5ee9038fae729e59e6cd1ac

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313t-manylinux_2_36_riscv64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313t-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 e2c49870752c750705ec85f23f5187e644c8d1b14177241da30dcd1f656d8218
MD5 bc9b0f9583ed579d3ffd6667cedd2b45
BLAKE2b-256 df54df53d0749a12215668b0cffe96e5642d524a5eb65d3bd066cc725297d7d8

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313t-manylinux_2_36_aarch64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 7bcca138ce668a27ed37e9288b425374ce36fdfe86c1f78e4b36a9e4f5e60e7c
MD5 cab7a60d759f51b0c1e67b8503bcd2e1
BLAKE2b-256 dd0c68390b60fed161de2397ba06e977fd8c93ff248f26dd3289d82b54cfeebe

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 c4fc75c002bf13b795008667758f1331e9f35274c5a3e87dca5225f73d923fa4
MD5 cedb4965f49ad6b21b567cfc5e2ae1c0
BLAKE2b-256 371d4aa9bc07121a86ea7d970e7a6d8ca458682dcc61963c72a1ace4d0ce2159

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313-manylinux_2_36_riscv64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 4f25ad37885cc4e8511e008543a2afe25141f9cc2da130e718fa1825fbbc0cd5
MD5 812665c2c6059ee7512264206c09d9c6
BLAKE2b-256 bf8bdd6e110fa5ae31dc2147b6a93827a517cc2d13e27ca5da9e039efae79989

See more details on using hashes here.

File details

Details for the file talyn-0.9.1-cp313-cp313-manylinux_2_36_aarch64.whl.

File metadata

File hashes

Hashes for talyn-0.9.1-cp313-cp313-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 ccafb8ab445b262c95fc62b14fbb1366bbbb20d1d60c94332776d7d5895de6f3
MD5 acbcd90a585092bfa0b19c87d3ba7d6b
BLAKE2b-256 c66338f347fa0d3495e1fa403f0b870ba5ec093c7f8bf1143f9fc9d8076c225a

See more details on using hashes here.

Release history Release notifications | RSS feed

0.9.6

12 files

0.9.4

12 files

0.9.3

12 files

0.9.2

12 files

This release

0.9.1 This release

12 files

0.9.0

12 files

0.8.8

12 files

0.8.7

12 files

0.8.5

12 files

0.8.4

8 files

0.8.3

7 files

0.8.2

8 files

0.8.1

8 files

0.8.0

8 files

0.7.0

7 files

0.6.4

4 files

0.6.3

4 files

0.6.2

4 files

0.6.1

4 files

0.6.0

4 files

0.5.0

4 files

0.4.0

4 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page