Freactor
Freactor is a lightweight flow-control framework for Python. It provides a simple way to define task pipelines using reducers and step transitions, supporting both synchronous and asynchronous (asyncio) execution.
Features
Task orchestration with clear step transitions (SUCCESS, FAILURE, RETRY, ABORT).
Reducer decorators with automatic retry/delay logic.
Async support: AsyncFreactor + async_freducer for coroutine-based workflows.
Logging with task IDs for easy observability.
High performance:
~20–35k async tasks/sec per process (I/O bound).
Supports 1M+ reducer steps per process in a single event loop.
Minimal dependencies, works with Python 3.8+.
Installation
pip install freactor
Or install in development mode:
git clone https://github.com/Pro-YY/freactor.git
cd freactor
pip install -e .
Quick Start
1. Define Reducers
import asyncio
import logging
from freactor import StatusCode, async_freducer
log = logging.getLogger(__name__)
SUCCESS = StatusCode.SUCCESS
@async_freducer(retry=3, delay=1)
async def step1(data):
log.info(f"[task {data['_task_id']}] step1 running...")
await asyncio.sleep(1) # simulate async workload
return SUCCESS, {"step1": True}, "done"
2. Configure Task Flow
TASK_CONFIG = {
"example_task": {
"init_step": ("example_reducers", "step1"),
"table": {
("example_reducers", "step1"): {SUCCESS: None}
},
}
}
3. Run Tasks with AsyncFreactor
import asyncio
from freactor import AsyncFreactor
async def main():
f = AsyncFreactor(
{"task_config": TASK_CONFIG, "import_reducer_prefix": "example_reducers."},
num_actors=8,
)
await f.run_task("example_task", {"param": "demo"})
await f.run_forever()
asyncio.run(main())
Benchmarks
AsyncFreactor:
100k tasks in ~4.3s (≈22k tasks/s).
1M tasks in ~45s on a 10-core machine.
Multiprocessing scaling: Combine multiple processes (each with its own actors) or connect pods via Redis Streams / RabbitMQ for horizontal scalability.
License
[MIT] This project is licensed under the MIT License.
Release files for freactor 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| freactor-1.0.1.tar.gz | 9.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| freactor-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.4 kB
Release files / freactor-1.0.1.tar.gz
| Download URL | freactor-1.0.1.tar.gz |
|---|---|
| Size | 9.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
52b55374c58dfc8b5c8b2b5c69c465f196ee5277c3a373ffcea7895582e77a8f
|
|
BLAKE2b-256 checksum How to use checksums |
1bffd30f347e7ff093635bfd6b617ccb825dd0acda7e2fe76e4e0a0d4fc62b07
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / freactor-1.0.1-py3-none-any.whl
| Download URL | freactor-1.0.1-py3-none-any.whl |
|---|---|
| Size | 9.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62bb350581502a7918d0f95c026744d3908ec79a67642ab2fb5f23373f5eb65c
|
|
BLAKE2b-256 checksum How to use checksums |
e439a4b5f978a005efd59a79c6d7349dea62e4d127578dce7b7b327a5b348680
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|