Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions kombu/asynchronous/hub.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions t/unit/asynchronous/test_hub.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Loading