Modern-DI integration for arq.
Full guide: arq integration docs
Installation
uv add modern-di-arq # or: pip install modern-di-arq
Usage
setup_di seeds the root container into arq's ctx dict and wires four of arq's lifecycle hooks: on_startup/on_shutdown open and close the root container, and on_job_start builds a Scope.REQUEST child container per job. Decorate a task with @inject to resolve its FromDI-marked parameters from that per-job child — the child is open only while @inject-decorated task body/bodies are running, reference-counted so nested and concurrent (asyncio.gather) @inject calls over the same job share one open child and close it exactly once, guaranteeing teardown even if arq skips on_job_end.
import typing
from arq.connections import RedisSettings
from modern_di import Container, Group, Scope, providers
from modern_di_arq import FromDI, inject, setup_di
class Settings:
def __init__(self) -> None:
self.greeting = "hello"
class Greeter:
def __init__(self, settings: Settings) -> None: # auto-injected by type
self._settings = settings
def greet(self, name: str) -> str:
return f"{self._settings.greeting}, {name}"
class AppGroup(Group):
settings = providers.Factory(Settings, scope=Scope.APP, cache=True)
greeter = providers.Factory(Greeter, scope=Scope.REQUEST)
@inject
async def greet(
ctx: dict[str, typing.Any], # arq passes its context dict as the first argument
name: str,
greeter: typing.Annotated[Greeter, FromDI(Greeter)], # resolve by type
) -> str:
return greeter.greet(name)
class WorkerSettings:
functions = [greet]
redis_settings = RedisSettings(host="localhost")
setup_di(WorkerSettings, Container(groups=[AppGroup], validate=True))
Run the worker as usual (arq mymodule.WorkerSettings) and enqueue jobs with only their real arguments — await pool.enqueue_job("greet", "world") — the FromDI parameters are resolved for you. A task must declare arq's ctx dict as its first parameter; injection is order-insensitive otherwise. arq's ctx is a plain dict (not a dedicated message type), so no context provider is registered — read job metadata from ctx, and fetch_di_container(ctx) returns the root container.
API
| Symbol | Description |
|---|---|
setup_di(worker_settings, container) |
Seeds the root container into arq's ctx and wires root + per-job lifecycle onto on_startup/on_shutdown/on_job_start/on_job_end. Accepts a WorkerSettings class/object or a settings dict; composes with existing hooks; returns the container. Raises TypeError if called twice on the same worker_settings |
FromDI(dependency) |
Inert marker for Annotated[T, FromDI(...)] in task signatures; accepts a provider instance or a type |
inject(task) |
Decorator that resolves FromDI-annotated parameters from the per-job Scope.REQUEST child. Order-insensitive; passthrough for tasks with no FromDI; raises TypeError at decoration if the task also declares *args/**kwargs |
fetch_di_container(ctx) |
Returns the root container from an arq ctx dict |
📦 PyPI
📝 License
Part of modern-python
Built on modern-di, a dependency-injection framework with IoC container and scopes.
Browse the full list of templates and libraries in
modern-python — see the org profile for the categorized index.
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 modern_di_arq-3.1.0.tar.gz.
File metadata
- Download URL: modern_di_arq-3.1.0.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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 |
8c40ae62455b32236ac545585a920e861b89404391c060ca8401a6f17176aeb1
|
|
| MD5 |
e69ead29d187b161b74c9616215c9ff0
|
|
| BLAKE2b-256 |
2b0d44a1c0ab778c1fc0d4d5b2881a6a391957445b7ceaa7aeffddec2d09dc51
|
File details
Details for the file modern_di_arq-3.1.0-py3-none-any.whl.
File metadata
- Download URL: modern_di_arq-3.1.0-py3-none-any.whl
- Upload date:
- Size: 6.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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 |
ffc5bc91b56ee0017496cc49226523a2479d39856573da0023f0f05a9968c6be
|
|
| MD5 |
2da3d8fbffd7c128d5845a5269deb6ff
|
|
| BLAKE2b-256 |
e68049af2bea57499dcc9ff487d11710790cfb2bf4987f17e23ed4f60b4edc0e
|