Pure asyncio actor framework for Python
Project description
async-pykka is a pure asyncio framework that implements the Actor model, inspired by Pykka-style APIs and focused on high-throughput I/O workloads.
Quick Start Example | Scenarios | Performance | FAQ
[!IMPORTANT] Same-loop constraint All actor operations must run in the same event loop. Cross-thread or cross-loop calls fail fast with
RuntimeError.
✨ Highlights
- Familiar Actor model API:
start / proxy / ask / tell / stop - Asyncio-first scheduling with no actor thread pool dependency
- Built-in async proxy and registry utilities for large actor sets
- Deterministic loop-bound safety model for production debugging
📥 Installation
Current latest tag: v0.1.4
From Git tag (recommended now)
pip install "git+https://github.com/yzbf-lin/async-pykka.git@v0.1.4"
From source archive (no git required)
pip install "https://github.com/yzbf-lin/async-pykka/archive/refs/tags/v0.1.4.tar.gz"
From release wheel (after release assets uploaded)
pip install "https://github.com/yzbf-lin/async-pykka/releases/download/v0.1.4/async_pykka-0.1.4-py3-none-any.whl"
PyPI publishing is planned. Until then, use GitHub tag/release installation methods.
Import package name: async_pykka.
🚀 Quick Start
uv venv
uv sync --group dev
uv run python examples/quickstart_counter.py
uv run pytest -q
Expected output: counter=5
🧩 Minimal Example
import asyncio
import async_pykka
class GreeterActor(async_pykka.AsyncioActor):
def __init__(self, name: str):
super().__init__()
self.name = name
async def greet(self) -> str:
return f"Hello, {self.name}!"
async def main() -> None:
ref = GreeterActor.start("World")
proxy = ref.proxy()
message = await proxy.greet()
print(message)
await ref.stop()
if __name__ == "__main__":
asyncio.run(main())
📦 Core API
| API | Description |
|---|---|
AsyncioActor |
Actor base class |
ActorRef.tell(msg) |
Fire-and-forget message send |
ActorRef.ask(msg) |
Request-response Future |
ActorRef.proxy() |
Async proxy facade |
ActorProxy.set(name, value) |
Safe actor state mutation |
ActorRegistry.stop_all() |
Graceful batch shutdown |
Future.get(timeout=...) |
Timeout-aware await |
🧠 Common Patterns
Request/Response with timeout
future = ref.ask({"type": "query", "key": "profile"})
result = await future.get(timeout=1.0)
Notify queue + batch handling
Put high-frequency notify events into a queue, then consume in batches.
Runnable example: examples/notify_batch.py
Graceful shutdown
results = await async_pykka.ActorRegistry.stop_all(current_loop_only=True)
assert all(results)
⚡ Network I/O A/B Benchmark
Run A/B benchmark against upstream pykka:
uv sync --group dev --group bench
./scripts/fetch_pykka_repo.sh
uv run python examples/benchmark_network_ab.py --actors 50 --requests 5000 --concurrency 200 --rounds 3
Benchmark setup (2026-03-06): actors=50, requests=5000, concurrency=200, payload_bytes=256, rounds=3, localhost TCP echo server.
|
|
|
| Metric (avg over 3 rounds) | async-pykka | pykka | Delta |
|---|---|---|---|
| Throughput (req/s) | 29999.08 | 14514.66 | +106.68% |
| Mean latency (ms) | 5.3951 | 11.9221 | 54.75% lower |
| p95 latency (ms) | 6.6906 | 13.9568 | 52.06% lower |
| p99 latency (ms) | 11.8346 | 20.5744 | 42.48% lower |
📚 Documentation
🛠 Development
uv sync --group dev
uv run ruff check .
uv run pytest -q
🚢 Publishing (Maintainers)
Option A: GitHub Actions (recommended)
This repository includes .github/workflows/publish-pypi.yml, which publishes on v* tags.
One-time setup on PyPI (Trusted Publishing):
- In PyPI project settings, add a Trusted Publisher with:
- Owner:
yzbf-lin - Repository:
async-pykka - Workflow:
publish-pypi.yml - Environment:
pypi
- Owner:
- In GitHub repo settings, create an environment named
pypi.
Release command:
git tag vX.Y.Z
git push origin vX.Y.Z
Option B: Local token publish
export PYPI_TOKEN='pypi-xxxxx'
./scripts/publish_pypi.sh
🙏 Attribution
This project is inspired by async proposals around Pykka and further adapted into a standalone asyncio-first framework.
See: ACKNOWLEDGEMENTS.md, THIRD_PARTY_NOTICES.md
📄 License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file async_pykka-0.1.4.tar.gz.
File metadata
- Download URL: async_pykka-0.1.4.tar.gz
- Upload date:
- Size: 41.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c62c3f826072ad7916da01279826d851f769a019f237f62be06f0150ed45756
|
|
| MD5 |
6bffc76fb2275eba7e90e296e355e755
|
|
| BLAKE2b-256 |
5d9d05ae719d400eacf8b155c73a926e1a30878a4a11ed59591fd2167e95f88f
|
Provenance
The following attestation bundles were made for async_pykka-0.1.4.tar.gz:
Publisher:
publish-pypi.yml on yzbf-lin/async-pykka
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
async_pykka-0.1.4.tar.gz -
Subject digest:
8c62c3f826072ad7916da01279826d851f769a019f237f62be06f0150ed45756 - Sigstore transparency entry: 1048899876
- Sigstore integration time:
-
Permalink:
yzbf-lin/async-pykka@6a443c96d6dadacc1dfb95522a91a5015a3e4781 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/yzbf-lin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@6a443c96d6dadacc1dfb95522a91a5015a3e4781 -
Trigger Event:
push
-
Statement type:
File details
Details for the file async_pykka-0.1.4-py3-none-any.whl.
File metadata
- Download URL: async_pykka-0.1.4-py3-none-any.whl
- Upload date:
- Size: 30.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d76d008cb155839fd013b94e1ff6acc982a621e663868e761b843ef23bab8ef
|
|
| MD5 |
ec1a004acd936204ab52172e65bcc11a
|
|
| BLAKE2b-256 |
abb9dc7130d2d7836ac5b3314384411442428f5fc69121c98b381bee796463d9
|
Provenance
The following attestation bundles were made for async_pykka-0.1.4-py3-none-any.whl:
Publisher:
publish-pypi.yml on yzbf-lin/async-pykka
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
async_pykka-0.1.4-py3-none-any.whl -
Subject digest:
5d76d008cb155839fd013b94e1ff6acc982a621e663868e761b843ef23bab8ef - Sigstore transparency entry: 1048899936
- Sigstore integration time:
-
Permalink:
yzbf-lin/async-pykka@6a443c96d6dadacc1dfb95522a91a5015a3e4781 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/yzbf-lin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@6a443c96d6dadacc1dfb95522a91a5015a3e4781 -
Trigger Event:
push
-
Statement type: