perf: await pending frames without idle worker

This commit is contained in:
kiyo9w 2026-09-28 14:06:57 +09:00
parent 1064e356de
commit b937be8e30
2 changed files with 99 additions and 5 deletions

View file

@ -11,6 +11,7 @@ newest frame.
from __future__ import annotations
import os
import asyncio
import sys
import threading
import time
@ -391,6 +392,39 @@ class ClassificationBudgetTests(unittest.TestCase):
session.close()
self.assertTrue(session.closed)
self.assertIsNone(session.take_pending(timeout=0.05))
def test_async_take_keeps_latest_and_wakes_on_close(self):
"""The server waiter must not miss a frame that beat registration, and close must wake it."""
session, engine, _, _ = make_session()
async def scenario():
session.submit_frame(1, frame_bytes())
session.submit_frame(2, frame_bytes())
first = await asyncio.wait_for(session.take_pending_async(), timeout=1.0)
self.assertEqual(first[0], 2)
waiting = asyncio.create_task(session.take_pending_async())
await asyncio.sleep(0)
self.assertFalse(waiting.done(), "an empty queue must not complete the waiter")
session.reset()
session.submit_frame(3, frame_bytes())
self.assertEqual((await asyncio.wait_for(waiting, timeout=1.0))[0], 3)
cancelled = asyncio.create_task(session.take_pending_async())
await asyncio.sleep(0)
cancelled.cancel()
with self.assertRaises(asyncio.CancelledError):
await cancelled
session.submit_frame(4, frame_bytes())
self.assertEqual((await asyncio.wait_for(session.take_pending_async(), timeout=1.0))[0], 4)
closing = asyncio.create_task(session.take_pending_async())
await asyncio.sleep(0)
session.close()
self.assertIsNone(await asyncio.wait_for(closing, timeout=1.0))
self.assertFalse(session.submit_frame(5, frame_bytes()))
asyncio.run(scenario())
engine.shutdown()