Skip to main content

High-performance WSGI/ASGI server for Python, powered by Rust

Project description

🦄 Tsuno

High-performance WSGI/ASGI server powered by Rust

Python Version License Development Status

Tsuno aims to be a drop-in replacement for Gunicorn and Uvicorn with a Rust-powered transport layer. Run your Django, Flask, FastAPI, Starlette, and connect-python applications with HTTP/2 support.

Installation

pip install tsuno

Quick Start

Command Line

tsuno myapp:app --workers 4 --bind 0.0.0.0:8000

Python API

Flask (WSGI):

from flask import Flask
from tsuno import run

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World"

if __name__ == "__main__":
    run(app)

FastAPI (ASGI):

from fastapi import FastAPI
from tsuno import run

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

if __name__ == "__main__":
    run(app)

See examples/ for complete working examples.

What Makes Tsuno Different

  • Mixed Protocol Serving: Serve WSGI and ASGI apps simultaneously on the same server (example)
  • High Performance: Powered by Tokio and hyper
  • Complete API Compatibility: Drop-in replacement for both Gunicorn AND Uvicorn as much as possible
  • Unix Domain Sockets: Full UDS support for nginx integration (example)

Examples

Complete working examples in the examples/ directory:

Example Description
wsgi_flask_app.py Flask WSGI application
asgi_fastapi_app.py FastAPI ASGI application
mixed_wsgi_asgi.py Mixed WSGI + ASGI serving (unique to Tsuno!)
wsgi_multi_app.py Multiple Flask apps on different paths
asgi_multi_app.py Multiple FastAPI apps on different paths
uds_example.py Unix Domain Socket server
lifespan_test.py ASGI Lifespan events demo
tsuno.toml TOML configuration example

Configuration

Command Line

# Basic
tsuno myapp:app --bind 0.0.0.0:8000 --workers 4

# With auto-reload (development)
tsuno myapp:app --reload

# With Unix domain socket
tsuno myapp:app --uds /tmp/tsuno.sock

# With configuration file
tsuno myapp:app -c tsuno.toml

Configuration File

Python format (Gunicorn-compatible):

# tsuno.conf.py
bind = "0.0.0.0:8000"
workers = 4
threads = 2
log_level = "info"

TOML format:

# tsuno.toml
bind = "0.0.0.0:8000"
workers = 4
threads = 2
log_level = "info"

See examples/tsuno.toml for all options.

Python API

from tsuno import run

run(
    app,
    host="0.0.0.0",
    port=8000,
    workers=4,
    reload=True,  # Development only
)

Production Features

Worker Management

  • Auto-restart crashed workers
  • Graceful shutdown and reload
  • Worker timeout monitoring
  • Max requests per worker (memory leak prevention)

Graceful Reload (Zero-Downtime)

# Start with PID file
tsuno myapp:app --pid /var/run/tsuno.pid

# Graceful reload (no downtime)
kill -HUP $(cat /var/run/tsuno.pid)

Logging

  • Structured logging (text/JSON)
  • Access log support
  • Customizable log formats

Performance

Performance varies by workload, platform, and configuration. Run wrk or h2load benchmarks to measure performance on your specific hardware.

Migration

From Gunicorn

# Before
gunicorn myapp:app --workers 4 --bind 0.0.0.0:8000

# After (same syntax!)
tsuno myapp:app --workers 4 --bind 0.0.0.0:8000

From Uvicorn

# Before
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, workers=4)

# After (compatible API!)
import tsuno
tsuno.run(app, host="0.0.0.0", port=8000, workers=4)

Development Status

Tsuno is in early development (alpha stage).

  • ⚠️ Real-world production testing needed

Help us test! Report issues at github.com/i2y/tsuno/issues

Requirements

  • Python 3.11 or later
  • Rust toolchain (for building from source)

License

MIT License - see LICENSE

Links

Acknowledgments

Tsuno is inspired by and builds upon excellent work from:

  • Gunicorn & Uvicorn: Server standards
  • Granian: Rust-Python hybrid architecture
  • Tokio, hyper, PyO3: Rust ecosystem

Project details


Download files

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

Source Distribution

tsuno-0.1.1.tar.gz (63.6 kB view details)

Uploaded Source

Built Distributions

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

tsuno-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ x86-64

tsuno-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

tsuno-0.1.1-cp311-abi3-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file tsuno-0.1.1.tar.gz.

File metadata

  • Download URL: tsuno-0.1.1.tar.gz
  • Upload date:
  • Size: 63.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tsuno-0.1.1.tar.gz
Algorithm Hash digest
SHA256 80589e83f3ec751afa542b56a54c8648fa671797256a50418382869ab012d137
MD5 0b09df60b8cc5d94d57b3f6a3e11d778
BLAKE2b-256 b42ce1b90ff3685211ed6ef4af63f0d858b6b867718e208c121124aed3b8ecc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tsuno-0.1.1.tar.gz:

Publisher: release.yml on i2y/tsuno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tsuno-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tsuno-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 56b29634f2bafe809956f52debf3272205ca1c89f366ab194e3cc08688c6dd39
MD5 d9de05688e30aaf9ff246c31a3aaa206
BLAKE2b-256 b595515f2dd25a1ee329ad3086eabfc1da71f68f1ae2ae07114d080008c1492c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tsuno-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on i2y/tsuno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tsuno-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tsuno-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fd60db5177f2b8c026210b3d179469c1763c499cdb20dcb29d1bd00e8de0043b
MD5 fd2aaa11181e8148d2c5ca295eb8e205
BLAKE2b-256 f64a73daef9bb9666a69b1056046840d4734f224fbc13acc1628e83013b6f25f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tsuno-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on i2y/tsuno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tsuno-0.1.1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tsuno-0.1.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad3624a983c1f0cc891c6c17fe90a4d4a7ec7258ec35b1020eb1509476d16d19
MD5 07ada276c65a643655f21d1ed344ee3a
BLAKE2b-256 966aecc571c61c5c8b00bfe6c0f4affa129fb2dd443fe2234a7a4d28ddc91d5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tsuno-0.1.1-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on i2y/tsuno

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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