@@ -130,15 +130,17 @@ async def run(
130
130
futures , queues , stop_event = await self ._start_processes (
131
131
manager , executor , scheduling_strategy
132
132
)
133
- run_info , requests_iter = self ._run_setup (
133
+ run_info , requests_iter , times_iter = self ._run_setup (
134
134
futures , scheduling_strategy , max_number , max_duration
135
135
)
136
136
137
137
# Add some initial requests to the queue
138
138
requests_iter = self ._add_requests (
139
139
requests_iter ,
140
140
queues .requests ,
141
+ times_iter ,
141
142
run_info ,
143
+ loop_limit = run_info .strategy .queued_requests_limit ,
142
144
)
143
145
# Wait for the test to start
144
146
await asyncio .sleep (time .time () - scheduling_strategy .start_time )
@@ -169,6 +171,7 @@ async def run(
169
171
requests_iter = self ._add_requests (
170
172
requests_iter ,
171
173
queues .requests ,
174
+ times_iter ,
172
175
run_info ,
173
176
)
174
177
await asyncio .sleep (0 ) # enable requests to start
@@ -257,8 +260,9 @@ def _run_setup(
257
260
scheduling_strategy : SchedulingStrategy ,
258
261
max_number : Optional [int ],
259
262
max_duration : Optional [float ],
260
- ) -> tuple [SchedulerRunInfo , Iterator [Any ]]:
263
+ ) -> tuple [SchedulerRunInfo , Iterator [Any ], Iterator [ float ] ]:
261
264
requests_iter = iter (self .request_loader )
265
+ times_iter = iter (scheduling_strategy .request_times ())
262
266
end_time = scheduling_strategy .start_time + (max_duration or math .inf )
263
267
end_number = max_number or math .inf
264
268
@@ -284,28 +288,32 @@ def _run_setup(
284
288
strategy = scheduling_strategy ,
285
289
)
286
290
287
- return info , requests_iter
291
+ return info , requests_iter , times_iter
288
292
289
293
def _add_requests (
290
294
self ,
291
295
requests_iter : Optional [Iterator [Any ]],
292
296
requests_queue : Queue [WorkerProcessRequest [RequestT , ResponseT ]],
297
+ times_iter : Iterator [float ],
293
298
run_info : SchedulerRunInfo ,
299
+ loop_limit : Optional [int ] = None ,
294
300
) -> Optional [Iterator [Any ]]:
295
301
if requests_iter is not None :
296
302
try :
297
303
added_count = 0
298
304
299
- if time .time () >= run_info .end_time :
300
- raise StopIteration
301
-
302
305
while not requests_queue .full () and added_count < (
303
- run_info .strategy .queued_requests_limit
304
- or settings .max_add_requests_per_loop
306
+ loop_limit or settings .max_add_requests_per_loop
305
307
):
306
308
if run_info .created_requests >= run_info .end_number :
307
309
raise StopIteration
308
310
311
+ if (
312
+ next (times_iter ) >= run_info .end_time
313
+ or time .time () >= run_info .end_time
314
+ ):
315
+ raise StopIteration
316
+
309
317
work_req = WorkerProcessRequest [RequestT , ResponseT ](
310
318
request = next (requests_iter ),
311
319
timeout_time = run_info .end_time ,
0 commit comments