def _run_scenario_continuously_for_duration(self, cls, method, args, duration, concurrent, timeout): pool = multiprocessing.Pool(concurrent) run_args = utils.infinite_run_args((cls, method, args)) iter_result = pool.imap(_run_scenario_loop, run_args) start = time.time() results_queue = collections.deque([], maxlen=concurrent) while True: if time.time() - start > duration * 60: break try: result = iter_result.next(timeout) except multiprocessing.TimeoutError as e: result = {"time": timeout, "idle_time": cls.idle_time, "error": utils.format_exc(e)} results_queue.append(result) results = list(results_queue) pool.terminate() pool.join() return results
def test_infinite_run_args(self): args = ("a", "b", "c", "d", 123) for i, real_args in enumerate(utils.infinite_run_args(args)): self.assertEqual((i,) + args, real_args) if i == 10: break