Slim the README to one `Context` showcase
The README inlined six example scripts; per our own "point at
`examples/`, don't duplicate" philosophy that's a lot of rot
surface. Drop all but the showcase and rework it onto the modern
`Context` API to mirror the docs landing + `we_are_processes.py`:
spawn a subactor per core, `open_context()` each, crash the root,
reap the tree.
Replace the rest with a short "want more?" pointer to the docs site
+ the `examples/` dir (where the debugger, streaming, cancellation,
`asyncio`, msging + cluster demos all live, CI-run).
Also tidy a few nits while here,
- fix the title typo "structurred" -> "structured",
- close the unterminated quote in the `UV_PROJECT_ENVIRONMENT`
install snippet,
- add the blank line a nested `trionics` bullet list needs so the
PyPI long-desc (this file) renders as valid RST.
(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-28 02:13:30 +00:00
|
|
|
|logo| ``tractor``: distributed structured concurrency
|
2018-08-03 04:55:50 +00:00
|
|
|
|
2025-03-24 16:54:12 +00:00
|
|
|
``tractor`` is a `structured concurrency`_ (SC), multi-processing_ runtime built on trio_.
|
2020-10-14 15:07:48 +00:00
|
|
|
|
2025-03-24 16:07:27 +00:00
|
|
|
Fundamentally, ``tractor`` provides parallelism via
|
2025-03-24 17:02:10 +00:00
|
|
|
``trio``-"*actors*": independent Python **processes** (i.e.
|
|
|
|
|
*non-shared-memory threads*) which can schedule ``trio`` tasks whilst
|
|
|
|
|
maintaining *end-to-end SC* inside a *distributed supervision tree*.
|
2023-01-28 23:56:15 +00:00
|
|
|
|
|
|
|
|
Cross-process (and thus cross-host) SC is accomplished through the
|
2025-03-24 16:07:27 +00:00
|
|
|
combined use of our,
|
|
|
|
|
|
|
|
|
|
- "actor nurseries_" which provide for spawning multiple, and
|
2025-03-24 17:02:10 +00:00
|
|
|
possibly nested, Python processes each running a ``trio`` scheduled
|
|
|
|
|
runtime - a call to ``trio.run()``,
|
|
|
|
|
- an "SC-transitive supervision protocol" enforced as an
|
|
|
|
|
IPC-message-spec encapsulating all RPC-dialogs.
|
2021-02-22 04:52:41 +00:00
|
|
|
|
2022-05-31 16:01:35 +00:00
|
|
|
We believe the system adheres to the `3 axioms`_ of an "`actor model`_"
|
2023-07-07 18:47:42 +00:00
|
|
|
but likely **does not** look like what **you** probably *think* an "actor
|
|
|
|
|
model" looks like, and that's **intentional**.
|
2019-11-22 21:43:49 +00:00
|
|
|
|
2023-07-07 18:47:42 +00:00
|
|
|
|
|
|
|
|
Where do i start!?
|
|
|
|
|
------------------
|
2026-06-28 18:20:50 +00:00
|
|
|
New to ``trio`` and **structured concurrency**? Our docs collect the
|
|
|
|
|
best starting points and then walk you straight into a hands-on
|
|
|
|
|
quickstart:
|
2018-07-12 19:18:02 +00:00
|
|
|
|
2026-06-28 18:20:50 +00:00
|
|
|
https://goodboy.github.io/tractor/start/quickstart.html
|
2021-02-22 04:13:51 +00:00
|
|
|
|
2021-02-24 04:42:48 +00:00
|
|
|
Features
|
|
|
|
|
--------
|
2025-03-24 16:07:27 +00:00
|
|
|
- **It's just** a ``trio`` API!
|
2025-03-24 17:02:10 +00:00
|
|
|
- *Infinitely nesteable* process trees running embedded ``trio`` tasks.
|
2025-03-24 17:18:50 +00:00
|
|
|
- Swappable, OS-specific, process spawning via multiple backends.
|
|
|
|
|
- Modular IPC stack, allowing for custom interchange formats (eg.
|
|
|
|
|
as offered from `msgspec`_), varied transport protocols (TCP, RUDP,
|
|
|
|
|
QUIC, wireguard), and OS-env specific higher-perf primitives (UDS,
|
|
|
|
|
shm-ring-buffers).
|
|
|
|
|
- Optionally distributed_: all IPC and RPC APIs work over multi-host
|
|
|
|
|
transports the same as local.
|
|
|
|
|
- Builtin high-level streaming API that enables your app to easily
|
2025-03-24 16:54:12 +00:00
|
|
|
leverage the benefits of a "`cheap or nasty`_" `(un)protocol`_.
|
2025-03-24 17:18:50 +00:00
|
|
|
- A "native UX" around a multi-process safe debugger REPL using
|
|
|
|
|
`pdbp`_ (a fork & fix of `pdb++`_)
|
|
|
|
|
- "Infected ``asyncio``" mode: support for starting an actor's
|
|
|
|
|
runtime as a `guest`_ on the ``asyncio`` loop allowing us to
|
|
|
|
|
provide stringent SC-style ``trio.Task``-supervision around any
|
|
|
|
|
``asyncio.Task`` spawned via our ``tractor.to_asyncio`` APIs.
|
|
|
|
|
- A **very naive** and still very much work-in-progress inter-actor
|
2025-03-24 16:54:12 +00:00
|
|
|
`discovery`_ sys with plans to support multiple `modern protocol`_
|
|
|
|
|
approaches.
|
2025-03-24 17:18:50 +00:00
|
|
|
- Various ``trio`` extension APIs via ``tractor.trionics`` such as,
|
Slim the README to one `Context` showcase
The README inlined six example scripts; per our own "point at
`examples/`, don't duplicate" philosophy that's a lot of rot
surface. Drop all but the showcase and rework it onto the modern
`Context` API to mirror the docs landing + `we_are_processes.py`:
spawn a subactor per core, `open_context()` each, crash the root,
reap the tree.
Replace the rest with a short "want more?" pointer to the docs site
+ the `examples/` dir (where the debugger, streaming, cancellation,
`asyncio`, msging + cluster demos all live, CI-run).
Also tidy a few nits while here,
- fix the title typo "structurred" -> "structured",
- close the unterminated quote in the `UV_PROJECT_ENVIRONMENT`
install snippet,
- add the blank line a nested `trionics` bullet list needs so the
PyPI long-desc (this file) renders as valid RST.
(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-28 02:13:30 +00:00
|
|
|
|
2025-03-24 17:18:50 +00:00
|
|
|
- task fan-out `broadcasting`_,
|
|
|
|
|
- multi-task-single-resource-caching and fan-out-to-multi
|
|
|
|
|
``__aenter__()`` APIs for ``@acm`` functions,
|
|
|
|
|
- (WIP) a ``TaskMngr``: one-cancels-one style nursery supervisor.
|
2025-03-24 16:07:27 +00:00
|
|
|
|
|
|
|
|
|
2025-07-13 19:35:19 +00:00
|
|
|
Status of `main` / infra
|
|
|
|
|
------------------------
|
|
|
|
|
|
|
|
|
|
- |gh_actions|
|
|
|
|
|
- |docs|
|
|
|
|
|
|
|
|
|
|
|
2025-03-24 16:07:27 +00:00
|
|
|
Install
|
|
|
|
|
-------
|
|
|
|
|
``tractor`` is still in a *alpha-near-beta-stage* for many
|
|
|
|
|
of its subsystems, however we are very close to having a stable
|
|
|
|
|
lowlevel runtime and API.
|
|
|
|
|
|
|
|
|
|
As such, it's currently recommended that you clone and install the
|
|
|
|
|
repo from source::
|
|
|
|
|
|
|
|
|
|
pip install git+git://github.com/goodboy/tractor.git
|
|
|
|
|
|
|
|
|
|
|
2025-03-24 17:18:50 +00:00
|
|
|
We use the very hip `uv`_ for project mgmt::
|
2025-03-24 16:07:27 +00:00
|
|
|
|
|
|
|
|
git clone https://github.com/goodboy/tractor.git
|
|
|
|
|
cd tractor
|
|
|
|
|
uv sync --dev
|
|
|
|
|
uv run python examples/rpc_bidir_streaming.py
|
|
|
|
|
|
|
|
|
|
Consider activating a virtual/project-env before starting to hack on
|
|
|
|
|
the code base::
|
|
|
|
|
|
|
|
|
|
# you could use plain ol' venvs
|
|
|
|
|
# https://docs.astral.sh/uv/pip/environments/
|
|
|
|
|
uv venv tractor_py313 --python 3.13
|
|
|
|
|
|
|
|
|
|
# but @goodboy prefers the more explicit (and shell agnostic)
|
|
|
|
|
# https://docs.astral.sh/uv/configuration/environment/#uv_project_environment
|
Slim the README to one `Context` showcase
The README inlined six example scripts; per our own "point at
`examples/`, don't duplicate" philosophy that's a lot of rot
surface. Drop all but the showcase and rework it onto the modern
`Context` API to mirror the docs landing + `we_are_processes.py`:
spawn a subactor per core, `open_context()` each, crash the root,
reap the tree.
Replace the rest with a short "want more?" pointer to the docs site
+ the `examples/` dir (where the debugger, streaming, cancellation,
`asyncio`, msging + cluster demos all live, CI-run).
Also tidy a few nits while here,
- fix the title typo "structurred" -> "structured",
- close the unterminated quote in the `UV_PROJECT_ENVIRONMENT`
install snippet,
- add the blank line a nested `trionics` bullet list needs so the
PyPI long-desc (this file) renders as valid RST.
(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-28 02:13:30 +00:00
|
|
|
UV_PROJECT_ENVIRONMENT="tractor_py313"
|
2025-03-24 16:07:27 +00:00
|
|
|
|
2025-03-24 17:18:50 +00:00
|
|
|
# hint hint, enter @goodboy's fave shell B)
|
|
|
|
|
uv run --dev xonsh
|
2025-03-24 16:07:27 +00:00
|
|
|
|
|
|
|
|
Alongside all this we ofc offer "releases" on PyPi::
|
|
|
|
|
|
|
|
|
|
pip install tractor
|
|
|
|
|
|
|
|
|
|
Just note that YMMV since the main git branch is often much further
|
|
|
|
|
ahead then any latest release.
|
|
|
|
|
|
2026-06-26 00:56:29 +00:00
|
|
|
Hacking on the docs themselves? The build + live-preview one-liners
|
|
|
|
|
(incl. nix-shell specifics) are collected in `notes_to_self/howtodocs.md
|
|
|
|
|
<https://github.com/goodboy/tractor/blob/main/notes_to_self/howtodocs.md>`_,
|
|
|
|
|
and rendered as the "Building these docs" section of our dev-tips guide.
|
|
|
|
|
|
2025-03-24 16:07:27 +00:00
|
|
|
|
|
|
|
|
Example codez
|
|
|
|
|
-------------
|
Slim the README to one `Context` showcase
The README inlined six example scripts; per our own "point at
`examples/`, don't duplicate" philosophy that's a lot of rot
surface. Drop all but the showcase and rework it onto the modern
`Context` API to mirror the docs landing + `we_are_processes.py`:
spawn a subactor per core, `open_context()` each, crash the root,
reap the tree.
Replace the rest with a short "want more?" pointer to the docs site
+ the `examples/` dir (where the debugger, streaming, cancellation,
`asyncio`, msging + cluster demos all live, CI-run).
Also tidy a few nits while here,
- fix the title typo "structurred" -> "structured",
- close the unterminated quote in the `UV_PROJECT_ENVIRONMENT`
install snippet,
- add the blank line a nested `trionics` bullet list needs so the
PyPI long-desc (this file) renders as valid RST.
(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-28 02:13:30 +00:00
|
|
|
We prefer to point you at the runnable scripts under ``examples/``
|
|
|
|
|
- each is CI-run and ``literalinclude``-d straight into the docs, so
|
2026-06-28 18:20:50 +00:00
|
|
|
what you read there is what actually runs - rather than inline a
|
|
|
|
|
pile of them here. The one-minute pitch: spawn a subactor per core,
|
|
|
|
|
open a ``Context`` into each, then crash the root *on purpose* and
|
|
|
|
|
watch the runtime reap the whole tree - zero zombies, guaranteed (if
|
|
|
|
|
you can make a zombie child without a system signal, it **is a
|
|
|
|
|
bug**).
|
|
|
|
|
|
|
|
|
|
See it run - plus the full tour (the flagship multi-process
|
|
|
|
|
debugger, bidirectional streaming over a ``Context``, cancellation,
|
|
|
|
|
discovery, "infected ``asyncio``", typed messaging and worker-pool /
|
|
|
|
|
cluster patterns) - in the docs:
|
2021-02-24 04:42:48 +00:00
|
|
|
|
Slim the README to one `Context` showcase
The README inlined six example scripts; per our own "point at
`examples/`, don't duplicate" philosophy that's a lot of rot
surface. Drop all but the showcase and rework it onto the modern
`Context` API to mirror the docs landing + `we_are_processes.py`:
spawn a subactor per core, `open_context()` each, crash the root,
reap the tree.
Replace the rest with a short "want more?" pointer to the docs site
+ the `examples/` dir (where the debugger, streaming, cancellation,
`asyncio`, msging + cluster demos all live, CI-run).
Also tidy a few nits while here,
- fix the title typo "structurred" -> "structured",
- close the unterminated quote in the `UV_PROJECT_ENVIRONMENT`
install snippet,
- add the blank line a nested `trionics` bullet list needs so the
PyPI long-desc (this file) renders as valid RST.
(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
2026-06-28 02:13:30 +00:00
|
|
|
- docs: https://goodboy.github.io/tractor/
|
|
|
|
|
- examples: https://github.com/goodboy/tractor/tree/main/examples
|
2021-02-24 04:42:48 +00:00
|
|
|
|
|
|
|
|
Under the hood
|
|
|
|
|
--------------
|
|
|
|
|
``tractor`` is an attempt to pair trionic_ `structured concurrency`_ with
|
|
|
|
|
distributed Python. You can think of it as a ``trio``
|
|
|
|
|
*-across-processes* or simply as an opinionated replacement for the
|
|
|
|
|
stdlib's ``multiprocessing`` but built on async programming primitives
|
|
|
|
|
from the ground up.
|
|
|
|
|
|
|
|
|
|
Don't be scared off by this description. ``tractor`` **is just** ``trio``
|
|
|
|
|
but with nurseries for process management and cancel-able streaming IPC.
|
|
|
|
|
If you understand how to work with ``trio``, ``tractor`` will give you
|
2021-05-31 12:37:44 +00:00
|
|
|
the parallelism you may have been needing.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Wait, huh?! I thought "actors" have messages, and mailboxes and stuff?!
|
2021-05-31 12:56:36 +00:00
|
|
|
***********************************************************************
|
2021-06-14 10:41:10 +00:00
|
|
|
Let's stop and ask how many canon actor model papers have you actually read ;)
|
|
|
|
|
|
|
|
|
|
From our experience many "actor systems" aren't really "actor models"
|
|
|
|
|
since they **don't adhere** to the `3 axioms`_ and pay even less
|
|
|
|
|
attention to the problem of *unbounded non-determinism* (which was the
|
|
|
|
|
whole point for creation of the model in the first place).
|
2021-05-31 12:37:44 +00:00
|
|
|
|
|
|
|
|
From the author's mouth, **the only thing required** is `adherance to`_
|
|
|
|
|
the `3 axioms`_, *and that's it*.
|
2021-02-24 04:42:48 +00:00
|
|
|
|
2021-06-14 10:41:10 +00:00
|
|
|
``tractor`` adheres to said base requirements of an "actor model"::
|
2021-05-31 12:56:36 +00:00
|
|
|
|
|
|
|
|
In response to a message, an actor may:
|
2021-05-31 12:37:44 +00:00
|
|
|
|
2021-05-31 12:56:36 +00:00
|
|
|
- send a finite number of new messages
|
|
|
|
|
- create a finite number of new actors
|
|
|
|
|
- designate a new behavior to process subsequent messages
|
|
|
|
|
|
2021-06-14 10:41:10 +00:00
|
|
|
|
|
|
|
|
**and** requires *no further api changes* to accomplish this.
|
2021-05-31 12:56:36 +00:00
|
|
|
|
|
|
|
|
If you want do debate this further please feel free to chime in on our
|
2021-06-14 10:41:10 +00:00
|
|
|
chat or discuss on one of the following issues *after you've read
|
2021-06-14 12:10:59 +00:00
|
|
|
everything in them*:
|
2021-06-14 10:41:10 +00:00
|
|
|
|
|
|
|
|
- https://github.com/goodboy/tractor/issues/210
|
|
|
|
|
- https://github.com/goodboy/tractor/issues/18
|
|
|
|
|
|
2021-05-31 12:37:44 +00:00
|
|
|
|
2021-05-31 12:56:36 +00:00
|
|
|
Let's clarify our parlance
|
|
|
|
|
**************************
|
2021-05-31 12:37:44 +00:00
|
|
|
Whether or not ``tractor`` has "actors" underneath should be mostly
|
2021-05-31 12:56:36 +00:00
|
|
|
irrelevant to users other then for referring to the interactions of our
|
|
|
|
|
primary runtime primitives: each Python process + ``trio.run()``
|
|
|
|
|
+ surrounding IPC machinery. These are our high level, base
|
|
|
|
|
*runtime-units-of-abstraction* which both *are* (as much as they can
|
|
|
|
|
be in Python) and will be referred to as our *"actors"*.
|
|
|
|
|
|
|
|
|
|
The main goal of ``tractor`` is is to allow for highly distributed
|
|
|
|
|
software that, through the adherence to *structured concurrency*,
|
|
|
|
|
results in systems which fail in predictable, recoverable and maybe even
|
|
|
|
|
understandable ways; being an "actor model" is just one way to describe
|
|
|
|
|
properties of the system.
|
2021-02-24 04:42:48 +00:00
|
|
|
|
|
|
|
|
|
2026-06-28 18:20:50 +00:00
|
|
|
What's on the TODO
|
|
|
|
|
------------------
|
|
|
|
|
The roadmap lives with our docs - see `what the future holds
|
|
|
|
|
<https://goodboy.github.io/tractor/project/index.html#what-the-future-holds>`_
|
|
|
|
|
for where ``tractor`` is headed.
|
2021-02-25 00:11:05 +00:00
|
|
|
|
2021-02-22 04:52:41 +00:00
|
|
|
Feel like saying hi?
|
|
|
|
|
--------------------
|
2019-01-17 04:19:29 +00:00
|
|
|
This project is very much coupled to the ongoing development of
|
2020-09-24 14:04:56 +00:00
|
|
|
``trio`` (i.e. ``tractor`` gets most of its ideas from that brilliant
|
2021-02-22 04:52:41 +00:00
|
|
|
community). If you want to help, have suggestions or just want to
|
|
|
|
|
say hi, please feel free to reach us in our `matrix channel`_. If
|
|
|
|
|
matrix seems too hip, we're also mostly all in the the `trio gitter
|
|
|
|
|
channel`_!
|
|
|
|
|
|
2023-07-07 18:47:42 +00:00
|
|
|
.. _distributed: https://en.wikipedia.org/wiki/Distributed_computing
|
2022-05-31 16:01:35 +00:00
|
|
|
.. _multi-processing: https://en.wikipedia.org/wiki/Multiprocessing
|
|
|
|
|
.. _trio: https://github.com/python-trio/trio
|
2021-05-31 12:37:44 +00:00
|
|
|
.. _nurseries: https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/#nurseries-a-structured-replacement-for-go-statements
|
|
|
|
|
.. _actor model: https://en.wikipedia.org/wiki/Actor_model
|
|
|
|
|
.. _trionic: https://trio.readthedocs.io/en/latest/design.html#high-level-design-principles
|
|
|
|
|
.. _3 axioms: https://www.youtube.com/watch?v=7erJ1DV_Tlo&t=162s
|
2021-03-11 15:07:59 +00:00
|
|
|
.. .. _3 axioms: https://en.wikipedia.org/wiki/Actor_model#Fundamental_concepts
|
2021-05-31 12:37:44 +00:00
|
|
|
.. _adherance to: https://www.youtube.com/watch?v=7erJ1DV_Tlo&t=1821s
|
2021-02-22 04:52:41 +00:00
|
|
|
.. _trio gitter channel: https://gitter.im/python-trio/general
|
|
|
|
|
.. _matrix channel: https://matrix.to/#/!tractor:matrix.org
|
2025-03-24 16:07:27 +00:00
|
|
|
.. _broadcasting: https://github.com/goodboy/tractor/pull/229
|
2023-05-15 02:52:24 +00:00
|
|
|
.. _pdbp: https://github.com/mdmintz/pdbp
|
2021-02-22 04:52:41 +00:00
|
|
|
.. _pdb++: https://github.com/pdbpp/pdbpp
|
2025-03-24 16:54:12 +00:00
|
|
|
.. _cheap or nasty: https://zguide.zeromq.org/docs/chapter7/#The-Cheap-or-Nasty-Pattern
|
|
|
|
|
.. _(un)protocol: https://zguide.zeromq.org/docs/chapter7/#Unprotocols
|
|
|
|
|
.. _discovery: https://zguide.zeromq.org/docs/chapter8/#Discovery
|
2025-03-24 17:30:12 +00:00
|
|
|
.. _modern protocol: https://en.wikipedia.org/wiki/Rendezvous_protocol
|
2021-12-10 19:15:23 +00:00
|
|
|
.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency
|
2025-03-24 16:07:27 +00:00
|
|
|
.. _uv: https://docs.astral.sh/uv/
|
2021-09-08 01:27:05 +00:00
|
|
|
.. _msgspec: https://jcristharif.com/msgspec/
|
2025-03-24 17:18:50 +00:00
|
|
|
.. _guest: https://trio.readthedocs.io/en/stable/reference-lowlevel.html?highlight=guest%20mode#using-guest-mode-to-run-trio-on-top-of-other-event-loops
|
2021-02-22 04:52:41 +00:00
|
|
|
|
2025-07-13 18:56:57 +00:00
|
|
|
..
|
|
|
|
|
NOTE, on generating badge links from the UI
|
|
|
|
|
https://docs.github.com/en/actions/how-tos/monitoring-and-troubleshooting-workflows/monitoring-workflows/adding-a-workflow-status-badge?ref=gitguardian-blog-automated-secrets-detection#using-the-ui
|
|
|
|
|
.. |gh_actions| image:: https://github.com/goodboy/tractor/actions/workflows/ci.yml/badge.svg?branch=main
|
|
|
|
|
:target: https://github.com/goodboy/tractor/actions/workflows/ci.yml
|
2021-02-24 04:42:48 +00:00
|
|
|
|
2026-06-28 18:20:50 +00:00
|
|
|
.. |docs| image:: https://github.com/goodboy/tractor/actions/workflows/docs.yml/badge.svg?branch=main
|
|
|
|
|
:target: https://goodboy.github.io/tractor/
|
|
|
|
|
:alt: Documentation
|
2021-02-24 03:23:31 +00:00
|
|
|
|
2026-06-27 22:13:06 +00:00
|
|
|
.. |logo| image:: _static/tractor_logo_wire.svg
|
2021-02-24 04:42:48 +00:00
|
|
|
:width: 250
|
2021-02-24 03:23:31 +00:00
|
|
|
:align: middle
|