12
12
13
13
import asyncio
14
14
import time
15
- from collections .abc import Generator , Iterable
15
+ from collections .abc import Generator
16
16
from multiprocessing import Queue
17
17
from multiprocessing .synchronize import Barrier as ProcessingBarrier
18
18
from multiprocessing .synchronize import Event as ProcessingEvent
@@ -112,6 +112,7 @@ def __init__(
112
112
]
113
113
] = None
114
114
self .requests_canceled : ThreadingEvent = None
115
+ self .pull_requests_stopped : ThreadingEvent = None
115
116
self .pull_task : asyncio .Task = None
116
117
self .push_task : asyncio .Task = None
117
118
@@ -243,6 +244,7 @@ async def _initialize_requests_processing(self):
243
244
)
244
245
self .pending_updates_queue = culsans .Queue ()
245
246
self .requests_canceled = ThreadingEvent ()
247
+ self .pull_requests_stopped = ThreadingEvent ()
246
248
247
249
# Start background tasks for queue management
248
250
self .pull_task = asyncio .create_task (
@@ -351,7 +353,7 @@ async def _process_next_request(self):
351
353
request_info = request_info ,
352
354
)
353
355
354
- if isinstance (request , Iterable ) and not isinstance ( request , ( str , bytes )):
356
+ if isinstance (request , ( list , tuple )):
355
357
raise NotImplementedError ("Multi-turn requests are not yet supported" )
356
358
357
359
# Calculate when to start processing request
@@ -373,9 +375,8 @@ async def _process_next_request(self):
373
375
request = request ,
374
376
request_info = request_info ,
375
377
)
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 ):
377
379
response = resp
378
- request_info = info
379
380
380
381
# Complete
381
382
request_info .scheduler_timings .resolve_end = time .time ()
@@ -460,7 +461,6 @@ async def _handle_request_update(
460
461
461
462
async def _cancel_pending_requests (self ):
462
463
while True :
463
- # All requests will be on the queue by now, loop until we can't get anymore
464
464
try :
465
465
request , request_info = await asyncio .wait_for (
466
466
self .pending_requests_queue .async_get (), timeout = self .poll_intervals
@@ -474,7 +474,9 @@ async def _cancel_pending_requests(self):
474
474
request_info = request_info ,
475
475
)
476
476
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
478
480
479
481
def _pull_requests_generator (self ) -> Generator :
480
482
last_check = time .time ()
@@ -491,14 +493,16 @@ def _pull_requests_generator(self) -> Generator:
491
493
pass # No update available, continue polling
492
494
except culsans .QueueShutDown :
493
495
break
494
- except Exception : # noqa: BLE001
496
+ except Exception : # noqa: BLE001, S110
495
497
pass
496
498
497
499
if time .time () - last_check > self .poll_intervals :
498
500
# Yield to allow cancel/error/stop checks in wrapper
499
501
last_check = time .time ()
500
502
yield None
501
503
504
+ self .pull_requests_stopped .set ()
505
+
502
506
def _push_updates_generator (self ) -> Generator :
503
507
last_check = time .time ()
504
508
@@ -514,7 +518,7 @@ def _push_updates_generator(self) -> Generator:
514
518
pass # No update available, continue polling
515
519
except culsans .QueueShutDown :
516
520
break
517
- except Exception : # noqa: BLE001
521
+ except Exception : # noqa: BLE001, S110
518
522
pass
519
523
520
524
if time .time () - last_check > self .poll_intervals :
0 commit comments