6
6
from multiprocessing import Manager
7
7
from queue import Empty as QueueEmpty
8
8
from queue import Queue
9
+ from threading import Event
9
10
from typing import (
10
11
Any ,
11
12
Generic ,
@@ -126,7 +127,7 @@ async def run(
126
127
) as executor ,
127
128
):
128
129
requests_iter : Optional [Iterator [Any ]] = None
129
- futures , queues = await self ._start_processes (
130
+ futures , queues , stop_event = await self ._start_processes (
130
131
manager , executor , scheduling_strategy
131
132
)
132
133
run_info , requests_iter , times_iter = self ._run_setup (
@@ -178,7 +179,7 @@ async def run(
178
179
run_info = run_info ,
179
180
)
180
181
181
- await self ._stop_processes (futures , queues . requests )
182
+ await self ._stop_processes (futures , stop_event )
182
183
183
184
async def _start_processes (
184
185
self ,
@@ -188,6 +189,7 @@ async def _start_processes(
188
189
) -> tuple [
189
190
list [asyncio .Future ],
190
191
MPQueues [RequestT , ResponseT ],
192
+ Event ,
191
193
]:
192
194
await self .worker .prepare_multiprocessing ()
193
195
queues : MPQueues [RequestT , ResponseT ] = MPQueues (
@@ -197,6 +199,7 @@ async def _start_processes(
197
199
times = manager .Queue (maxsize = scheduling_strategy .processing_requests_limit ),
198
200
responses = manager .Queue (),
199
201
)
202
+ stop_event = manager .Event ()
200
203
201
204
num_processes = min (
202
205
scheduling_strategy .processes_limit ,
@@ -226,6 +229,7 @@ async def _start_processes(
226
229
executor ,
227
230
self .worker .process_loop_asynchronous ,
228
231
queues ,
232
+ stop_event ,
229
233
False , # TODO: Make configurable
230
234
requests_limit ,
231
235
id_ ,
@@ -234,7 +238,7 @@ async def _start_processes(
234
238
235
239
await asyncio .sleep (0.1 ) # give time for processes to start
236
240
237
- return futures , queues
241
+ return futures , queues , stop_event
238
242
239
243
def _run_setup (
240
244
self ,
@@ -369,10 +373,9 @@ def _check_result_ready(
369
373
async def _stop_processes (
370
374
self ,
371
375
futures : list [asyncio .Future ],
372
- requests_queue : Queue [ RequestSession [ RequestT , ResponseT ]] ,
376
+ stop_event : Event ,
373
377
):
374
- # FIXME: Need new method for stopping workers
375
- for _ in futures :
376
- requests_queue .put (None )
378
+ # stop all processes
379
+ stop_event .set ()
377
380
378
381
await asyncio .gather (* futures )
0 commit comments