π The scheduler that simply works. π
Documentation: https://asyncz.dymmond.com π
Source Code: https://github.com/dymmond/asyncz
Asyncz is an async-first scheduler for Python applications and ASGI services. It wraps the core APScheduler model in a codebase that is focused on asyncio, explicit task objects, pluggable stores and executors, and framework-friendly lifecycle integration.
Documentation: https://asyncz.dymmond.com
AsyncIOSchedulerandNativeAsyncIOSchedulerfor async runtimes.- Built-in triggers for
date,interval,cron,and,or, andshutdown. - Built-in stores for
memory,file,mongodb,redis, andsqlalchemy. - Executors for in-event-loop work, thread pools, process pools, and direct debug execution.
- CLI commands for starting schedulers and managing persisted tasks.
- Task inspection snapshots and filtered task queries for dashboards, CLIs, and admin tooling.
- Optional dashboard UI for browsing tasks, filtering by schedule metadata, and viewing captured logs.
- Standard-library logging throughout the project.
pip install asynczUseful extras:
pip install "asyncz[dashboard]"
pip install "asyncz[localtime]"import logging
from asyncz.schedulers import AsyncIOScheduler
logging.basicConfig(level=logging.INFO)
scheduler = AsyncIOScheduler()
def cleanup() -> None:
logging.getLogger(__name__).info("cleanup finished")
scheduler.add_task(cleanup, "interval", minutes=5, id="cleanup-task")
scheduler.start()Asyncz is built around four main component types:
Tasks are the public unit of scheduling. A task combines a callable, a trigger, an executor alias, and the metadata needed to persist and reschedule it correctly.
Asyncz uses Python's built-in logging module. The default logger namespaces are:
asyncz.schedulersasyncz.executors.<alias>asyncz.stores.<alias>
If you need custom logger creation, pass your own loggers_class to the scheduler. That class only needs to implement the same dictionary-like contract used by ClassicLogging.
Asyncz can wrap an ASGI app directly:
from asyncz.schedulers import AsyncIOScheduler
scheduler = AsyncIOScheduler()
application = scheduler.asgi(application)Or you can wire startup and shutdown hooks manually:
from asyncz.schedulers import AsyncIOScheduler
scheduler = AsyncIOScheduler()
app = Lilya(
routes=[...],
on_startup=[scheduler.start],
on_shutdown=[scheduler.shutdown],
)The scheduler also supports synchronous and asynchronous context managers, which makes it easy to use inside lifespan handlers.
The default store is in-memory. For durable scheduling, configure a file, MongoDB, Redis, or SQLAlchemy store.
Persistent stores support the ASYNCZ_STORE_ENCRYPTION_KEY environment variable. When it is set, task payloads are encrypted before they are written to the backing store.
Asyncz ships with:
- a CLI for
start,add,list,run,pause,resume, andremove - a Lilya-based dashboard with task controls, task filters, and a log viewer
See the documentation for usage details:
