class MultiProcessRunner(BaseRunner): JOIN_TIMEOUT = 60 def __init__(self, target, **kwargs): super(MultiProcessRunner, self).__init__(target, **kwargs) self.process = None # type: Process @capture_monitor_exception def start(self): self.process = Process(target=self.target, kwargs=self.kwargs) self.process.start() @capture_monitor_exception def stop(self): if self.process and self.is_alive(): self.process.terminate() self.process.join(MultiProcessRunner.JOIN_TIMEOUT) if self.process.is_alive(): self.process.kill() @capture_monitor_exception def heartbeat(self): # do we want to do something here? pass @capture_monitor_exception def is_alive(self): return self.process.is_alive() def __str__(self): s = super(MultiProcessRunner, self).__str__() return f"{s}({self.process})"
class Temp_API_Server: def __init__(self): self.port = random_port() self.proc = None def __enter__(self): self.start_server() return self def __exit__(self, exc_type, exc_val, exc_tb): self.stop_server() def http_GET(self, path=''): try: full_url = urljoin(self.server_url(), path) return GET_json(full_url) except: return None def server_running(self): return self.proc.is_alive() def start_server(self): self.proc = Process(target=run_server, args=[self.port]) self.proc.start() return self.wait_for_server_ok() def stop_server(self): self.proc.kill() self.proc.join() def server_url(self): return f"http://127.0.0.1:{self.port}" def wait_for_server_ok(self, max_attempts=20, wait_interval=0.1): for i in range(0, max_attempts): status = self.http_GET('/health') if status: return status wait_for(wait_interval)