- **BREAKING** The scheduler classes were moved to be importable (only) directly from
the ``apscheduler`` package (``apscheduler.Scheduler`` and
``apscheduler.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 the ``Job`` class
(which is now immutable)
- **BREAKING** Workers were merged into schedulers. As the ``Worker`` and
``AsyncWorker`` classes have been removed, you now need to pass
``role=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 new ``current_async_scheduler`` context variable, and will always be available
when a scheduler is running in the current context, while ``current_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 an ``AsyncExitStack`` (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 in ``SQLAlchemyDataStore`` not being applied
- Fixed SQLalchemy 2.0 compatibility