1212
1313import asyncio
1414import time
15- from collections .abc import Generator , Iterable
15+ from collections .abc import Generator
1616from multiprocessing import Queue
1717from multiprocessing .synchronize import Barrier as ProcessingBarrier
1818from multiprocessing .synchronize import Event as ProcessingEvent
@@ -112,6 +112,7 @@ def __init__(
112112 ]
113113 ] = None
114114 self .requests_canceled : ThreadingEvent = None
115+ self .pull_requests_stopped : ThreadingEvent = None
115116 self .pull_task : asyncio .Task = None
116117 self .push_task : asyncio .Task = None
117118
@@ -243,6 +244,7 @@ async def _initialize_requests_processing(self):
243244 )
244245 self .pending_updates_queue = culsans .Queue ()
245246 self .requests_canceled = ThreadingEvent ()
247+ self .pull_requests_stopped = ThreadingEvent ()
246248
247249 # Start background tasks for queue management
248250 self .pull_task = asyncio .create_task (
@@ -351,7 +353,7 @@ async def _process_next_request(self):
351353 request_info = request_info ,
352354 )
353355
354- if isinstance (request , Iterable ) and not isinstance ( request , ( str , bytes )):
356+ if isinstance (request , ( list , tuple )):
355357 raise NotImplementedError ("Multi-turn requests are not yet supported" )
356358
357359 # Calculate when to start processing request
@@ -373,9 +375,8 @@ async def _process_next_request(self):
373375 request = request ,
374376 request_info = request_info ,
375377 )
376- async for resp , info in self .backend .resolve (request , request_info , None ):
378+ async for resp in self .backend .resolve (request , request_info , None ):
377379 response = resp
378- request_info = info
379380
380381 # Complete
381382 request_info .scheduler_timings .resolve_end = time .time ()
@@ -460,7 +461,6 @@ async def _handle_request_update(
460461
461462 async def _cancel_pending_requests (self ):
462463 while True :
463- # All requests will be on the queue by now, loop until we can't get anymore
464464 try :
465465 request , request_info = await asyncio .wait_for (
466466 self .pending_requests_queue .async_get (), timeout = self .poll_intervals
@@ -474,7 +474,9 @@ async def _cancel_pending_requests(self):
474474 request_info = request_info ,
475475 )
476476 except (culsans .QueueEmpty , asyncio .TimeoutError ):
477- break
477+ if self .pull_requests_stopped .is_set ():
478+ # No more requests will be put on the Queue
479+ break
478480
479481 def _pull_requests_generator (self ) -> Generator :
480482 last_check = time .time ()
@@ -491,14 +493,16 @@ def _pull_requests_generator(self) -> Generator:
491493 pass # No update available, continue polling
492494 except culsans .QueueShutDown :
493495 break
494- except Exception : # noqa: BLE001
496+ except Exception : # noqa: BLE001, S110
495497 pass
496498
497499 if time .time () - last_check > self .poll_intervals :
498500 # Yield to allow cancel/error/stop checks in wrapper
499501 last_check = time .time ()
500502 yield None
501503
504+ self .pull_requests_stopped .set ()
505+
502506 def _push_updates_generator (self ) -> Generator :
503507 last_check = time .time ()
504508
@@ -514,7 +518,7 @@ def _push_updates_generator(self) -> Generator:
514518 pass # No update available, continue polling
515519 except culsans .QueueShutDown :
516520 break
517- except Exception : # noqa: BLE001
521+ except Exception : # noqa: BLE001, S110
518522 pass
519523
520524 if time .time () - last_check > self .poll_intervals :
0 commit comments