Skip to content

Commit d19271e

Browse files
BYKclaude
andcommitted
fix: Add asyncio.sleep(0) after worker.kill() to clean up coroutines
After AsyncWorker.kill() cancels tasks, the event loop needs a tick to actually process the cancellations. Without this, pytest reports PytestUnraisableExceptionWarning for never-awaited coroutines. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent cb932d2 commit d19271e

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

tests/test_transport.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,7 @@ async def test_async_worker_is_alive_after_start():
11991199
worker.start()
12001200
assert worker.is_alive is True
12011201
worker.kill()
1202+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
12021203

12031204

12041205
@skip_under_gevent
@@ -1218,6 +1219,7 @@ async def test_async_worker_is_alive_wrong_pid():
12181219

12191220
worker._task_for_pid = os.getpid()
12201221
worker.kill()
1222+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
12211223

12221224

12231225
@skip_under_gevent
@@ -1248,6 +1250,7 @@ async def test_async_worker_start_creates_queue_and_task():
12481250
assert worker._loop is not None
12491251
assert worker._task_for_pid == __import__("os").getpid()
12501252
worker.kill()
1253+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
12511254

12521255

12531256
@pytest.mark.skipif(not PY38, reason="AsyncWorker requires Python 3.8+")
@@ -1275,9 +1278,11 @@ async def test_async_worker_start_reuses_existing_queue():
12751278
queue_ref = worker._queue
12761279
# Kill and restart — queue should be reused
12771280
worker.kill()
1281+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
12781282
worker.start()
12791283
assert worker._queue is queue_ref
12801284
worker.kill()
1285+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
12811286

12821287

12831288
@skip_under_gevent
@@ -1302,6 +1307,7 @@ async def test_async_worker_full_when_not_full():
13021307
worker.start()
13031308
assert worker.full() is False
13041309
worker.kill()
1310+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
13051311

13061312

13071313
@skip_under_gevent
@@ -1325,6 +1331,7 @@ async def slow_cb():
13251331
worker.submit(slow_cb)
13261332
assert worker.full() is True
13271333
worker.kill()
1334+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
13281335

13291336

13301337
@skip_under_gevent
@@ -1346,6 +1353,7 @@ async def callback():
13461353
await asyncio.sleep(0.1)
13471354
assert results == ["done"]
13481355
worker.kill()
1356+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
13491357

13501358

13511359
@skip_under_gevent
@@ -1368,6 +1376,7 @@ async def slow_cb():
13681376
# Now it's full
13691377
assert worker.submit(slow_cb) is False
13701378
worker.kill()
1379+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
13711380

13721381

13731382
@skip_under_gevent
@@ -1408,6 +1417,7 @@ async def slow_callback():
14081417

14091418
assert len(worker._active_tasks) > 0
14101419
worker.kill()
1420+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
14111421
await asyncio.sleep(0.05) # Let cancellation propagate
14121422

14131423
assert worker._task is None
@@ -1435,6 +1445,7 @@ async def slow_cb():
14351445
worker.submit(slow_cb)
14361446
# Now queue is full, kill should still work
14371447
worker.kill()
1448+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
14381449
assert worker._task is None
14391450

14401451

@@ -1448,6 +1459,7 @@ async def test_async_worker_kill_no_task():
14481459
worker = AsyncWorker()
14491460
# Should not raise
14501461
worker.kill()
1462+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
14511463
assert worker._task is None
14521464

14531465

@@ -1465,6 +1477,7 @@ async def test_async_worker_flush_returns_task():
14651477
assert isinstance(task, asyncio.Task)
14661478
await task
14671479
worker.kill()
1480+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
14681481

14691482

14701483
@skip_under_gevent
@@ -1489,6 +1502,7 @@ async def test_async_worker_flush_returns_none_zero_timeout():
14891502
worker.start()
14901503
assert worker.flush(timeout=0.0) is None
14911504
worker.kill()
1505+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
14921506

14931507

14941508
@skip_under_gevent
@@ -1529,6 +1543,7 @@ async def slow_cb():
15291543
await worker._wait_flush(timeout=0.2, callback=flush_callback)
15301544
assert len(callback_calls) >= 1
15311545
worker.kill()
1546+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
15321547

15331548

15341549
@skip_under_gevent
@@ -1554,6 +1569,7 @@ async def very_slow_cb():
15541569
assert "flush timed out" in str(mock_logger.error.call_args)
15551570

15561571
worker.kill()
1572+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
15571573

15581574

15591575
@skip_under_gevent
@@ -1618,6 +1634,7 @@ async def will_be_cancelled():
16181634

16191635
worker._queue = saved_queue
16201636
worker.kill()
1637+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
16211638

16221639

16231640
@skip_under_gevent
@@ -1640,6 +1657,7 @@ async def failing_cb():
16401657
# Check that the task was removed from active_tasks
16411658
assert len(worker._active_tasks) == 0
16421659
worker.kill()
1660+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
16431661

16441662

16451663
@skip_under_gevent
@@ -1669,6 +1687,7 @@ async def simple_cb():
16691687
worker._on_task_complete(mock_task)
16701688
assert mock_task not in worker._active_tasks
16711689
worker.kill()
1690+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
16721691

16731692

16741693
@skip_under_gevent
@@ -1683,6 +1702,7 @@ async def test_async_worker_ensure_task_calls_start():
16831702
worker._ensure_task()
16841703
assert worker.is_alive is True
16851704
worker.kill()
1705+
await asyncio.sleep(0) # Allow cancelled tasks to be cleaned up
16861706

16871707

16881708
# ============================================================================

0 commit comments

Comments
 (0)