From d9bc788bd9655c1fc5f72f73f10b223751e8149d Mon Sep 17 00:00:00 2001 From: Oliver Haas Date: Tue, 4 Nov 2025 12:27:51 +0100 Subject: [PATCH 1/2] fix: ensure hub close does also remove global event loop reference --- kombu/asynchronous/hub.py | 5 +++++ t/unit/asynchronous/test_hub.py | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/kombu/asynchronous/hub.py b/kombu/asynchronous/hub.py index ad0a14674f..edaa2725de 100644 --- a/kombu/asynchronous/hub.py +++ b/kombu/asynchronous/hub.py @@ -256,6 +256,7 @@ def _pop_ready(self): return ready def close(self, *args): + global _current_loop [self._unregister(fd) for fd in self.readers] self.readers.clear() [self._unregister(fd) for fd in self.writers] @@ -274,6 +275,10 @@ def close(self, *args): for item in todos: item() + # Clear global event loop variable if this hub is the current loop + if _current_loop is self: + set_event_loop(None) + def _discard(self, fd): fd = fileno(fd) self.readers.pop(fd, None) diff --git a/t/unit/asynchronous/test_hub.py b/t/unit/asynchronous/test_hub.py index 4f37e8ee05..9fba3b4525 100644 --- a/t/unit/asynchronous/test_hub.py +++ b/t/unit/asynchronous/test_hub.py @@ -586,3 +586,30 @@ def test__pop_ready_uses_lock(self): with patch.object(self.hub, '_ready_lock', autospec=True) as lock: self.hub._pop_ready() lock.__enter__.assert_called_once() + + def test_close_clears_global_event_loop(self): + # Test that closing a hub clears the global event loop if it's the current one + prev_loop = get_event_loop() + try: + hub = Hub() + set_event_loop(hub) + assert get_event_loop() is hub + hub.close() + assert get_event_loop() is None + finally: + set_event_loop(prev_loop) + + def test_close_does_not_clear_other_event_loop(self): + # Test that closing a hub doesn't clear the global event loop if it's a different one + prev_loop = get_event_loop() + try: + hub1 = Hub() + hub2 = Hub() + set_event_loop(hub1) + assert get_event_loop() is hub1 + hub2.close() + # hub1 should still be the current loop + assert get_event_loop() is hub1 + hub1.close() + finally: + set_event_loop(prev_loop) From e816ee73b0ab9468e188051c0fc11e609946092c Mon Sep 17 00:00:00 2001 From: Oliver Haas Date: Tue, 4 Nov 2025 13:56:53 +0100 Subject: [PATCH 2/2] fix: remove unnecessary global reference to _current_loop in Hub.close() --- kombu/asynchronous/hub.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kombu/asynchronous/hub.py b/kombu/asynchronous/hub.py index edaa2725de..6c43630da2 100644 --- a/kombu/asynchronous/hub.py +++ b/kombu/asynchronous/hub.py @@ -256,7 +256,6 @@ def _pop_ready(self): return ready def close(self, *args): - global _current_loop [self._unregister(fd) for fd in self.readers] self.readers.clear() [self._unregister(fd) for fd in self.writers]