From 2f07824347190026e3dc40c66cffbb5604d09799 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Sat, 6 Jan 2024 12:12:16 +0000 Subject: [PATCH] Hold references to background tasks to avoid garbage collection (Fixes #1191) --- src/socketio/async_server.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/socketio/async_server.py b/src/socketio/async_server.py index dc23123e..91a14d06 100644 --- a/src/socketio/async_server.py +++ b/src/socketio/async_server.py @@ -7,6 +7,11 @@ from . import exceptions from . import packet +# this set is used to keep references to background tasks to prevent them from +# being garbage collected mid-execution. Solution taken from +# https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task +task_reference_holder = set() + class AsyncServer(base_server.BaseServer): """A Socket.IO server for asyncio. @@ -588,8 +593,11 @@ async def _handle_event(self, eio_sid, namespace, id, data): sid, namespace) return if self.async_handlers: - self.start_background_task(self._handle_event_internal, self, sid, - eio_sid, data, namespace, id) + task = self.start_background_task( + self._handle_event_internal, self, sid, eio_sid, data, + namespace, id) + task_reference_holder.add(task) + task.add_done_callback(task_reference_holder.discard) else: await self._handle_event_internal(self, sid, eio_sid, data, namespace, id)