Skip to content

Commit e14589a

Browse files
Fix scheduler shutdown (#102)
1 parent 9356ef8 commit e14589a

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

src/dipdup/dipdup.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
import hashlib
33
import logging
4-
from contextlib import AsyncExitStack
4+
from contextlib import AsyncExitStack, asynccontextmanager
55
from os import listdir
66
from os.path import join
77
from typing import Dict, List, Optional, cast
@@ -216,7 +216,7 @@ async def run(self, reindex: bool, oneshot: bool) -> None:
216216
datasource_tasks = [] if oneshot else [asyncio.create_task(d.run()) for d in self._datasources.values()]
217217

218218
if self._config.jobs and not oneshot:
219-
stack.enter_context(self._scheduler)
219+
await stack.enter_async_context(self._scheduler_context())
220220
for job_name, job_config in self._config.jobs.items():
221221
add_job(self._ctx, self._scheduler, job_name, job_config)
222222

@@ -351,3 +351,11 @@ def _finish_migration(self, version: str) -> None:
351351
self._logger.warning('Your project has been migrated to spec version %s.', version)
352352
self._logger.warning('Review and commit changes before proceeding.')
353353
self._logger.warning('==================== WARNING =====================')
354+
355+
@asynccontextmanager
356+
async def _scheduler_context(self):
357+
self._scheduler.start()
358+
try:
359+
yield
360+
finally:
361+
self._scheduler.shutdown()

src/dipdup/http.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ async def __aenter__(self) -> None:
6464
)
6565

6666
async def __aexit__(self, exc_type, exc, tb):
67+
self._logger.info('Closing gateway session (%s)', self._url)
6768
await self.__session.close()
6869

6970
@property

src/dipdup/scheduler.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from contextlib import AsyncExitStack
2+
13
from apscheduler.executors.asyncio import AsyncIOExecutor # type: ignore
24
from apscheduler.jobstores.memory import MemoryJobStore # type: ignore
35
from apscheduler.schedulers.asyncio import AsyncIOScheduler # type: ignore
@@ -31,16 +33,19 @@ def create_scheduler() -> AsyncIOScheduler:
3133

3234

3335
def add_job(ctx: DipDupContext, scheduler: AsyncIOScheduler, job_name: str, job_config: JobConfig) -> None:
34-
async def _atomic_wrapper(ctx, args):
35-
async with in_global_transaction():
36+
async def _wrapper(ctx, args) -> None:
37+
nonlocal job_config
38+
async with AsyncExitStack() as stack:
39+
if job_config.atomic:
40+
await stack.enter_async_context(in_global_transaction())
3641
await job_config.callback_fn(ctx, args)
3742

3843
if job_config.crontab:
3944
trigger = CronTrigger.from_crontab(job_config.crontab)
4045
elif job_config.interval:
4146
trigger = IntervalTrigger(seconds=job_config.interval)
4247
scheduler.add_job(
43-
func=_atomic_wrapper if job_config.atomic else job_config.callback_fn,
48+
func=_wrapper,
4449
id=job_name,
4550
name=job_name,
4651
trigger=trigger,

0 commit comments

Comments
 (0)