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.
  • 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.

⏱️ 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.8.7-cp314-cp314t-manylinux_2_36_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.36+ x86-64

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

Uploaded CPython 3.14tmanylinux: glibc 2.36+ riscv64

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

Uploaded CPython 3.14tmanylinux: glibc 2.36+ ARM64

talyn-0.8.7-cp314-cp314-manylinux_2_36_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ x86-64

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

Uploaded CPython 3.14manylinux: glibc 2.36+ riscv64

talyn-0.8.7-cp314-cp314-manylinux_2_36_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ ARM64

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

Uploaded CPython 3.13tmanylinux: glibc 2.36+ x86-64

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

Uploaded CPython 3.13tmanylinux: glibc 2.36+ riscv64

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

Uploaded CPython 3.13tmanylinux: glibc 2.36+ ARM64

talyn-0.8.7-cp313-cp313-manylinux_2_36_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.36+ riscv64

talyn-0.8.7-cp313-cp313-manylinux_2_36_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ ARM64

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 dbebca39fea667fa21195541d48c7c4a4c4e7d67370a8ccfd2cac97806e7f6ce
MD5 09cee2e5a136f011c9f658050a09d217
BLAKE2b-256 23a21ae370318fdbe2dbf624410b5561dc5468dd5683e13fa56fc05bde1d1488

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314t-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 344c435e53a18fd37fbef21d3d8d34e9a137aed1c5eb0008379abeba8e7584c8
MD5 bacef27dd867a73a94836221e8413c44
BLAKE2b-256 d802a37ac4a1225518352c00d7bfd47215d53366c681f2581ca86c1a42e200ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 ac9e615b3c4eb50634855d5ea6826aa7fa0b09307d98934695d49a7419e6f58d
MD5 3c02718b2e2cd32fdcecd9e4940cc3e1
BLAKE2b-256 131040b0f9fcdd1a6dcea6de66f129b5cd32067be4a21934483eb63c8f521cfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 3ec769d210398f0cb2ce4fbda9030b38c3f04d3c38ec6512df92bb02b62e2e0d
MD5 57b53d95258e457586813f8b7229a03d
BLAKE2b-256 710ee9e7cf489a040bd016aa5f4abf79d9d8ac079ecdab496994281ef9026ef7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 3de7bc32b2bda6ab7db5ecc7776d6def564d6d651af118e4f42d0837f5c43d20
MD5 21f8405771858ebe15cd3e25892127af
BLAKE2b-256 462ae8561123806f8452c16ddf1bcf12aa3fe75d4a9b9e345d677cb6d6184e94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp314-cp314-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 0dbefd586e00dc6dfc27a25af42c1430664bf5bd6766aaa90e9e9012bfb0772a
MD5 7871843841eb70b1c7fc757b2d4304a6
BLAKE2b-256 dc10e6cac15215edb445145141dfbf4bd0fa4bc31878cb93b35a534146ab9c05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 ac04bbeac8dfa1bccaa806bfc7583f6a9b36dc151b03dd281782c2b0e768a93d
MD5 1aac96257cb3e366ea21a897b0339711
BLAKE2b-256 2abbb809107a76f517e5a30b0a92f3601c40d19f160350296b8272d55be67ef3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313t-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 99e278ec9dceede2055e96ceff58262deac0a71fd7dbb9a902fd98e298266ad2
MD5 739c8e54febad9dc1d6c832e22344b37
BLAKE2b-256 b31054f82e46b4f461bc35209f007e6c9ac717a4b1f684c31ee61808908a3a9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 eeabdfc1f83b08f89224daa65ca8871b62851728b93df8af2cafbdab002e2035
MD5 85807e42d3fee10918be9ae2fa57d28c
BLAKE2b-256 4956d62402202da4cfc58cb9b53304d8de53bd903124c273e790d429c9bd9b2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 1bd85a50593d7dcba1089a9da66b1b439c6892ed5ff4b5f6f1e014cb9b3b1c2a
MD5 90e1ef6d4bc8d7b445f6c3bbb2955407
BLAKE2b-256 40ee1448d128c9fd38aed4e29f65275d6717ada6e3c5e608205742ac3c5aebe2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313-manylinux_2_36_riscv64.whl
Algorithm Hash digest
SHA256 5cfc9f3b12d3197cfb849626760153a5377f140eb95439a66b44d8e0232c0645
MD5 02095443ff2c150ba95a2cfa6fa3d9fb
BLAKE2b-256 f26d9b6daa6f18b3839524cf3042a1645287dc8c0863cb52e55928da9fa424d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.7-cp313-cp313-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 0b83757e8530166031a224c2eb8f82b982efcc6b65dce29669222fe977846526
MD5 e74c24f3487e188b3785cb181974d0cd
BLAKE2b-256 3daa9788be2ce4d3975293d43e7b00db7e692784f225056d7e980718e1d06ca6

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

0.9.1

12 files

0.9.0

12 files

0.8.8

12 files

This release

0.8.7 This release

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