- BREAKING The scheduler classes were moved to be importable (only) directly from the
apscheduler
package (apscheduler.Scheduler
andapscheduler.AsyncScheduler
) - BREAKING Removed the "tags" field in schedules and jobs (this will be added back when the feature has been fully thought through)
- BREAKING Removed the
JobInfo
class in favor of just using theJob
class (which is now immutable) - BREAKING Workers were merged into schedulers. As the
Worker
andAsyncWorker
classes have been removed, you now need to passrole=SchedulerRole.scheduler
to the scheduler to prevent it from processing due jobs. The worker event classes (WorkerEvent
,WorkerStarted
,WorkerStopped
) have also been removed. - BREAKING The synchronous interfaces for event brokers and data stores have been removed. Synchronous libraries can still be used to implement these services through the use of
anyio.to_thread.run_sync()
. - BREAKING The
current_worker
context variable has been removed - BREAKING The
current_scheduler
context variable is now specified to only contain the currently running instance of a synchronous scheduler (apscheduler.Scheduler
). The asynchronous scheduler instance can be fetched from the newcurrent_async_scheduler
context variable, and will always be available when a scheduler is running in the current context, whilecurrent_scheduler
is only available when the synchronous wrapper is being run. - BREAKING Changed the initialization of data stores and event brokers to use a single
start()
method that accepts anAsyncExitStack
(and, depending on the interface, other arguments too) - BREAKING Added a concept of "job executors". This determines how the task function is executed once picked up by a worker. Several data structures and scheduler methods have a new field/parameter for this,
job_executor
. This addition requires database schema changes too. - Dropped support for Python 3.7
- Added support for Python 3.12
- Added the ability to run jobs in worker processes, courtesy of the
processpool
executor - Added the ability to run jobs in the Qt event loop via the
qt
executor - Added the
get_jobs()
scheduler method - The synchronous scheduler now runs an asyncio event loop in a thread, acting as a façade for
AsyncScheduler
- Fixed the
schema
parameter inSQLAlchemyDataStore
not being applied - Fixed SQLalchemy 2.0 compatibility