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})"
Exemple #2
0
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)