def launch(self):
        """
            Runs load balancing proxy thread
                and self.shards ParameterServer processes
            Returns after all threads and processes are running
        """
        self.proxy = ZmqProxyThread(in_add=self.serving_frontend_add,
                                    out_add=self.serving_backend_add,
                                    pattern='router-dealer')
        self.proxy.start()

        self.workers = []
        for i in range(self.shards):
            worker = ParameterServer(
                publisher_host=self.publisher_host,
                publisher_port=self.publisher_port,
                serving_host='localhost',
                serving_port=self.backend_port,
                load_balanced=True,
            )
            worker.start()
            self.workers.append(worker)

            Runs load balancing proxy thread
                and self.shards ParameterServer processes
            Returns after all threads and processes are running
        
surreal/distributed/parameter_server.py