Skip to content

Commit 3d5f912

Browse files
authored
Close worker background event loops (#256)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: adb27bb3-082b-4553-9941-7672749d7424
1 parent d71af0f commit 3d5f912

3 files changed

Lines changed: 21 additions & 3 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ import paths, `__all__`, `dir()`, and star-imports behave exactly as before.
5454

5555
FIXED
5656

57+
- Fixed `TaskHubGrpcWorker` leaving its background event loop unclosed after
58+
shutdown, which could retain resources and emit delayed `ResourceWarning`
59+
messages.
5760
- Fixed `AsyncTaskHubGrpcClient` failing during construction when no current
5861
event loop was set. SDK-owned async gRPC channels are now created on first use,
5962
binding them to the event loop that performs the RPC.

‎durabletask/worker.py‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -760,9 +760,7 @@ def start(self):
760760
self._shutdown.clear()
761761

762762
def run_loop() -> None:
763-
loop = asyncio.new_event_loop()
764-
asyncio.set_event_loop(loop)
765-
loop.run_until_complete(self._async_run_loop())
763+
asyncio.run(self._async_run_loop())
766764

767765
self._logger.info(f"Starting gRPC worker that connects to {self._host_address}")
768766
self._runLoop = Thread(target=run_loop)

‎tests/durabletask/test_worker_resiliency.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,23 @@ async def fake_run_loop():
180180
worker.stop()
181181

182182

183+
def test_worker_start_closes_background_event_loop():
184+
worker = TaskHubGrpcWorker()
185+
event_loops = []
186+
187+
async def fake_run_loop():
188+
event_loops.append(asyncio.get_running_loop())
189+
190+
worker._async_run_loop = fake_run_loop
191+
worker.start()
192+
worker._runLoop.join(timeout=1.0)
193+
194+
assert len(event_loops) == 1
195+
assert event_loops[0].is_closed() is True
196+
197+
worker.stop()
198+
199+
183200
def test_worker_classifies_graceful_close_before_first_message():
184201
worker = TaskHubGrpcWorker(
185202
resiliency_options=GrpcWorkerResiliencyOptions(silent_disconnect_timeout_seconds=5.0)

0 commit comments

Comments
 (0)