tarsk
A Python task queue whose workers hold a memory ceiling you set — without losing a task.
task with rust through the middle. The scheduler, retry state machine, lease tracking and
child supervision are Rust; the only Python in the hot path is your handler.
pip install tarsk # memory broker only
pip install tarsk-redis # + Redis Streams
pip install tarsk-postgres # + Postgres
pip install tarsk-amqp # + RabbitMQ
Pick one. All four are the same tarsk with a different broker compiled in — same
import, same API, same tarsk package — so installing two of them leaves you running
whichever one pip unpacked last. tarsk refuses to import when it finds more than one, and
a build without the backend your URL asks for names the package you want.
Upgrading from 0.1.x: this is a breaking change.
pip install tarskhas shipped Redis, Postgres and AMQP since 0.1. From 0.2.0 it ships none of them — it is the memory-broker build. If your broker URL is anything butmemory://,pip uninstall tarskand install the package for your broker. Nothing in your code changes. See CHANGELOG.md.
Status: early. The version badge above reads live from PyPI — a number written here went stale twice before this sentence replaced it. Wheels for Linux (glibc and musl, x86_64 and aarch64), macOS universal2 and Windows x64, on Python 3.11 through 3.14 including the free-threaded build. See What is missing.
📖 Documentation — everything below the fold lives there: how it works, writing tasks, routing and scheduling, operating, benchmarks.
# pip install tarsk-redis
from tarsk import App
app = App(broker="redis://localhost:6379/0")
@app.task(retries=3, timeout=30, queue="heavy")
def embed_document(doc_id: str) -> dict:
...
task_id = embed_document.send("abc")
tarsk worker --app myapp:app --broker redis://localhost:6379/0 \
--queues heavy --children 4 --max-rss 400MB --metrics 0.0.0.0:9090
Handlers must be idempotent. Delivery is at-least-once. This is a contract, not a footnote: a worker killed mid-task will run that task again.
What it does that others do not
One hour, 72,001 tasks, a handler that never frees anything. 66 recycles, peak 400 MB against a 400 MB ceiling, no sample over it, nothing killed, nothing lost. The flat line beneath the sawtooth, on the same axis, is the supervisor doing the holding: 28.32 to 28.40 MB across the hour, a drift of 82 KB. A ceiling enforced from inside a process with the same problem would only defer it.
Every Python task queue leaks, because leaks come from the code they run rather than from the queue. The difference is what the runtime does about it.
--max-rss is a byte budget. Celery's --max-tasks-per-child is a task count, which only
bounds bytes if you already know how many bytes a task costs — and stays wrong once that
changes. Same configuration, different workloads:
| leak 20MB/task | leak 40MB/task | payload-dependent 2–80MB | |
|---|---|---|---|
celery --max-tasks-per-child=6 |
162 MB | 282 MB | 327 MB |
tarsk --max-rss=200MB |
183 MB | 183 MB | 187 MB |
Celery wins the first column, and that is the honest result: when the leak per task is known and constant, dividing the budget by it works — someone divided 200 by 20 and typed 6. It is the other two columns tarsk was built for: nothing was reconfigured between them, the workload moved, and the guess encoded in that 6 went with it.
The worker that runs your code is 27 MB against Celery's 41 MB and taskiq's 44 MB, because it imports your tasks and nothing else — no broker driver, no scheduler. Recycling costs 7 ms at the 99th percentile against Celery's 139 ms, because the replacement child starts before the trigger fires and the slot never goes empty.
What it does not claim
Not faster. With a 50 ms handler tarsk, Celery and taskiq all reach 19–20 tasks/s. Draining 10,000 no-op tasks across four processes: Celery 10.0s, taskiq 2.3s, tarsk 2.2s — ahead in every run and by 4%, which this project's own benchmark rules call a tie. It starts in half the time and runs in half the memory; that is the claim, and speed is not.
This file claimed a 1.45× lead until the numbers were checked on more than one machine. The full retraction, and every column where tarsk loses, is in the benchmarks.
Not a hard ceiling regardless of task size. The ceiling is read at the dispatch decision, and
a handler that allocates 300 MB will allocate it. Overshoot is bounded by the peak of whatever is
in flight when the limit is crossed — with --slots 1 that is one task, because the child is idle
at the moment it is read; at the default of 100 slots it is up to 100. The budget divides the
remaining headroom by the measured per-task cost, so that number is usually far below the slot
count, but the only way to bound it at one task is --slots 1.
Not durable execution. That is Temporal's category, and it is much heavier.
What is missing
- No chord.
chainandgroupare here; fanning back in to a callback is not - Windows runs the suites that need no broker, since neither Redis nor Postgres ships for it. Everything else — the channel, recycling, the memory ceiling — is tested there
Running the tests
The toolchain is pinned in mise.toml — Rust 1.94.0 and Python 3.14.3, the
versions the published numbers were produced with. With mise installed,
mise install fetches both and entering the directory creates .venv from the pinned Python.
Without it, any Python 3.11+ and a recent stable Rust will build: the wheel is abi3-py311.
python -m venv .venv && .venv/bin/pip install maturin msgpack
# Every backend in one build: the published wheels take one each, the source
# tree is where all four are tested.
.venv/bin/maturin develop --release -F redis,postgres,amqp
.venv/bin/python tests/test_ipc.py # protocol, timeouts, retries
.venv/bin/python tests/test_recycle.py # the ceiling, soft timeouts, middleware
.venv/bin/python tests/test_brokers.py # all four brokers end to end
cargo test --lib # cron, console, socket permissions
The broker tests start their own redis-server and Postgres cluster, use any RabbitMQ
answering on the conventional ports, and skip whichever is missing — loudly, so a skip
cannot pass for a pass. TARSK_REDIS_URL, TARSK_PG_URL and TARSK_AMQP_URL point them
at servers you already have instead, which is how a machine without the server binaries
still tests those backends. Give each one a database of its own. python demo/run.py --minutes 1 --ceiling 150MB --rate 30 is the definition of done
in miniature: it exits non-zero if a task goes missing or the supervisor drifts.
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 tarsk_amqp-0.2.0.tar.gz.
File metadata
- Download URL: tarsk_amqp-0.2.0.tar.gz
- Upload date:
- Size: 132.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7998ac565fb8c4ca9c2ebd51750e3f02199cde70543ccab3e9bb11b3d7ad8d4
|
|
| MD5 |
34bc752bd2ab8523b86f88de8a51cb1c
|
|
| BLAKE2b-256 |
bfdba42d3d372f35537055d175f030d0aecf62dad67fe7501e8933623b2dac26
|
File details
Details for the file tarsk_amqp-0.2.0-cp314-cp314t-win_amd64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp314-cp314t-win_amd64.whl
- Upload date:
- Size: 2.8 MB
- Tags: CPython 3.14t, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11b7a2008e06eb3d4e08ce0b52d99858b1347b8f4570bd74f76f2283c3e0d78f
|
|
| MD5 |
d4f6826f26bc04b093ebd3dc4d1fd546
|
|
| BLAKE2b-256 |
b1ebdac8693f8f9e732b5c8f8be59d3d08ba4080e76a90a17d6048b13458e212
|
File details
Details for the file tarsk_amqp-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 3.6 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef49e5c02d9e2274a42af0dcdbb67f63328360411a92c6178579e48b1716a001
|
|
| MD5 |
786dccb22073e05180d215e081b03df6
|
|
| BLAKE2b-256 |
fe6757f71df11c1389ec3142a872ed949e2a760f3a559fdc05a6e139254699a6
|
File details
Details for the file tarsk_amqp-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93a6800fb632a84d22fbf076c9f61bd56260161827b73b61a0f9caea63fd17bf
|
|
| MD5 |
0bf39e63c14804f78b508082d15eec8e
|
|
| BLAKE2b-256 |
388d120809d01ce74d8be685c3c0bb47167811d402f931f6b1406574e67d567b
|
File details
Details for the file tarsk_amqp-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4d89f46282c0200cb621331e82641fe6a83774ef116d4e9d5061206273b17b4
|
|
| MD5 |
d6ab05651aed39d914ebbc6594302fdb
|
|
| BLAKE2b-256 |
6f440c6f0bc4ec9c8288766cf2d4de795648e64a3a8a473154a02bd19408c234
|
File details
Details for the file tarsk_amqp-0.2.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 5.8 MB
- Tags: CPython 3.14t, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4083ea19940317e1293f6837c35c1bf2912014f35e2cbd79f65e0aa7211f787
|
|
| MD5 |
3cc736d38d1e4150a6a302efd3954a2f
|
|
| BLAKE2b-256 |
f676d207fededc92549db8d43638ace4023c99c054a9a772ebba317896ded415
|
File details
Details for the file tarsk_amqp-0.2.0-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 2.8 MB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29fe94070e213fd6f67835691d7c690d449a28eddfd846448441aab27dfd81c7
|
|
| MD5 |
03dcdbabd2e6c511deaf5ae4c8910f0a
|
|
| BLAKE2b-256 |
05be11813c29741682347565488f2685dfe89031567867b8054e9c06550ae4ab
|
File details
Details for the file tarsk_amqp-0.2.0-cp311-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp311-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 3.6 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b76ac0873fc1999a219169a2087842313ecf1982ef0452e59294b7ec7d68452
|
|
| MD5 |
d477845f125cbffb0bef0704375af26f
|
|
| BLAKE2b-256 |
fec21ccb857c01999df08f86918993f2003e6d1d21460a2966aaa6a388d13720
|
File details
Details for the file tarsk_amqp-0.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42f4ab600d24d8192b9a44648f73e9576d97e738f053a374eb56c7ab4609796b
|
|
| MD5 |
a20aac012457d854dfdd63874b426bb6
|
|
| BLAKE2b-256 |
5a3c95fca8c92d74cae819ad170d4366d901517005d80bcd19b91b98d0a1607d
|
File details
Details for the file tarsk_amqp-0.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.8 MB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3742041ca8a231546c739849aabe5f58390dfe4d27cc2d8764823488597d0b83
|
|
| MD5 |
c4e19b8c7b613e8a3fd0281ef34dd3e5
|
|
| BLAKE2b-256 |
951360dc13a5fa58c1224bf993685eff1147e44281d2f6bda0160ce197596261
|
File details
Details for the file tarsk_amqp-0.2.0-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.
File metadata
- Download URL: tarsk_amqp-0.2.0-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 5.8 MB
- Tags: CPython 3.11+, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdb61cb30563ded6d0adfc5346e1ae20a354a4b2eb341c8a7d7846598a2d12ec
|
|
| MD5 |
45705445cb70182e7b6656783925f7e5
|
|
| BLAKE2b-256 |
dc88b69ae22ec7b53cb3526452e73be0eada0370d45af64fb8a1c18501673da6
|