Skip to content

Connecting & Nesting Routers

By themselves, routers do nothing. You must include them in your main Repid application instance so the worker knows they exist and can start listening for their tasks.

from repid import Repid
from myapp.routers import router

app = Repid()

# Register all actors defined on the router
app.include_router(router)

Default Configurations

When you create a Router, you can pass default configurations. Any actor attached to this router will inherit these defaults unless they explicitly override them.

from repid import Router

# All actors on this router will default to the "background_jobs" channel
# and have a timeout of 10 seconds.
router = Router(channel="background_jobs", timeout=10.0)

@router.actor()  # Inherits "background_jobs" and 10s timeout
async def task_a():
    pass

@router.actor(timeout=30.0)  # Overrides timeout, but inherits "background_jobs"
async def task_b():
    pass

Nesting Routers

Just like how you can attach routers to your Repid app, you can also attach routers to other routers using router.include_router(). This allows you to build deeply nested, highly modular applications.

When you include a child router into a parent router, defaults propagate downwards. If the child router doesn't specify a configuration (like channel or timeout), it will inherit the parent's configuration!

parent_router = Router(channel="main_queue", timeout=60.0)
child_router = Router()

@child_router.actor()
async def my_nested_actor():
    pass

# The child_router will now inherit `channel="main_queue"` and `timeout=60.0`
parent_router.include_router(child_router)

# Finally, connect the parent to the app
app.include_router(parent_router)

Middlewares Concatenation

When dealing with middlewares during nesting, they are concatenated, not overwritten. The parent router's middlewares will run before the child router's middlewares!