From 6f1711e0bd60208ccca3ed3a3bd98ca16f254f84 Mon Sep 17 00:00:00 2001 From: Kylmakalle Date: Sun, 8 Oct 2023 01:46:25 +0300 Subject: [PATCH] Preserve update handling task pointers, backport of #1328 --- aiogram/dispatcher/dispatcher.py | 5 ++++- aiogram/webhook/aiohttp_server.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index 827b300a..ad4cefd0 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -95,6 +95,7 @@ class Dispatcher(Router): self._running_lock = Lock() self._stop_signal: Optional[Event] = None self._stopped_signal: Optional[Event] = None + self._handle_update_tasks = set() def __getitem__(self, item: str) -> Any: return self.workflow_data[item] @@ -349,7 +350,9 @@ class Dispatcher(Router): ): handle_update = self._process_update(bot=bot, update=update, **kwargs) if handle_as_tasks: - asyncio.create_task(handle_update) + handle_update_task = asyncio.create_task(handle_update) + self._handle_update_tasks.add(handle_update_task) + handle_update_task.add_done_callback(self._handle_update_tasks.discard) else: await handle_update finally: diff --git a/aiogram/webhook/aiohttp_server.py b/aiogram/webhook/aiohttp_server.py index bf9f2aaf..2378d704 100644 --- a/aiogram/webhook/aiohttp_server.py +++ b/aiogram/webhook/aiohttp_server.py @@ -98,6 +98,7 @@ class BaseRequestHandler(ABC): self.dispatcher = dispatcher self.handle_in_background = handle_in_background self.data = data + self._background_feed_update_tasks = set() def register(self, app: Application, /, path: str, **kwargs: Any) -> None: """ @@ -139,11 +140,13 @@ class BaseRequestHandler(ABC): await self.dispatcher.silent_call_request(bot=bot, result=result) async def _handle_request_background(self, bot: Bot, request: web.Request) -> web.Response: - asyncio.create_task( + feed_update_task = asyncio.create_task( self._background_feed_update( bot=bot, update=await request.json(loads=bot.session.json_loads) ) ) + self._background_feed_update_tasks.add(feed_update_task) + feed_update_task.add_done_callback(self._background_feed_update_tasks.discard) return web.json_response({}, dumps=bot.session.json_dumps) def _build_response_writer(