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 has been built, compiled, and verified extensively under Fedora 43-44 on an x86_64 architecture equipped with an Intel(R) Core(TM) Ultra 7 265 processor. Compatibility with other Linux distributions, older kernels, or alternative hardware architectures (e.g. AArch64) has not been verified yet. We welcome feedback and pull requests for other environments!


🔧 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
    

⚡ 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.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.8.1-cp314-cp314t-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.36+ ARM64

talyn-0.8.1-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.1-cp314-cp314-manylinux_2_36_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ ARM64

talyn-0.8.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.8.1-cp313-cp313t-manylinux_2_36_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.36+ ARM64

talyn-0.8.1-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.1-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.1-cp314-cp314t-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for talyn-0.8.1-cp314-cp314t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 7b9e558a6d8cde6d0f5b0751cbeba75762f137a3c5dfce8565c651f56583f992
MD5 7f036b1035bdb6fbf39023ac1a2bf876
BLAKE2b-256 68f6e0f7ade928d94ff88973a5a8bf61a983a431949845e6bebf27e5156a4bca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp314-cp314t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 24c68c01b89a5f334e926bf7c22e196a85d69b65f3576ffc1a74865b386035c5
MD5 b7942a7a73029563d17f9ad09d691451
BLAKE2b-256 6b50043ea51ee6b2d4f4332199830160b51772d0357e546c7d9c6c3f503febd5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp314-cp314-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 59cdcd6aa20800e56249bd3b487c89aefbc67a3477f7c0d029442ce308523601
MD5 945972097378aee78121fc24afa05411
BLAKE2b-256 1dd4c251db927f6a8ddb7da0acaa9bf428e5ccd3d879c963750aedd37925f1bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp314-cp314-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 53e8de5e1f735017174bca135de9ea91194cf769316e32991c14faeac44e20c4
MD5 b496fc88e71e67175ccaeb959736febd
BLAKE2b-256 1287b5e7fbf025e8c0872ffb5f163b8282f6b81c3aef1203e575d9866638a2bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp313-cp313t-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 a81db9f8adbe93977d90502de0951584af4901136a33992af12146812fa20a7f
MD5 3e71d45bf4ed7a057d0276b4e4498c02
BLAKE2b-256 38c602147baf10d4ad816829dfc697ef60e6b76672039018d5384bcc1a236cbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp313-cp313t-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 9d47db633dd4f5f99dc4e9fea7ddf6e13ca55ffad08d3b97d84d88e03f808247
MD5 8b5ac9caa9e4ee4b4adcbd13d7474df4
BLAKE2b-256 5f1228af01ac6e0fa5b0e9c25035bb2683094d929fa91636bb0d52c0f47d2e17

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 f88c3e490a302db3444762c35cb94900851f229dbecc01070fa85a8f7008f725
MD5 246b13656ac9708a241dc165bee0eab3
BLAKE2b-256 bc0d6b8dffa414516fb76d8bb5a713746a0c57f1d91bbab2dd9c76e7b3572413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for talyn-0.8.1-cp313-cp313-manylinux_2_36_aarch64.whl
Algorithm Hash digest
SHA256 f1fb1699b05442617913b1516188a6005565b421927b7fd9f642750b6826c676
MD5 929b90cc0f5e1be8aced5b71290a555f
BLAKE2b-256 2c089d8143f0c22d18da4273881d7f8db2aff7c3a53817905554f7b87c71fa2a

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

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

This release

0.8.1 This release

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