def _ensure_initialized(self):
        if self.initialized:
            return

        num_attempts = 25
        attempt = 0
        for attempt in range(num_attempts):
            self.workers = [
                MultiAgentEnvWorker(i, self.make_env_func, self.env_config)
                for i in range(self.num_agents)
            ]

            try:
                port_to_use = udp_port_num(self.env_config)
                port = find_available_port(port_to_use, increment=1000)
                log.debug('Using port %d', port)
                init_info = dict(port=port)

                for i, worker in enumerate(self.workers):
                    worker.task_queue.put((init_info, TaskType.INIT))
                    if self.safe_init:
                        time.sleep(1.0)  # just in case
                    else:
                        time.sleep(0.01)

                for i, worker in enumerate(self.workers):
                    worker.result_queue.get(timeout=5)
                    worker.result_queue.task_done()
                    worker.task_queue.join()
            except Exception as exc:
                for worker in self.workers:
                    if isinstance(worker.process, threading.Thread):
                        log.info(
                            'We cannot really kill a thread, so let the whole process die'
                        )
                        raise RuntimeError(
                            'Critical error: worker stuck on initialization. Abort!'
                        )
                    else:
                        log.info('Killing process %r', worker.process.pid)
                        kill(worker.process.pid)
                del self.workers
                log.warning('Could not initialize env, try again! Error: %r',
                            exc)
                time.sleep(1)
            else:
                break

        if attempt >= num_attempts:
            log.error('Could not initialize env even after %d attempts. Fail!',
                      attempt)
            raise RuntimeError(
                'Critical error: worker stuck on initialization, num attempts exceeded. Abort!'
            )

        log.debug('%d agent workers initialized for env %d!',
                  len(self.workers), self.env_config.worker_index)
        log.debug('Took %d attempts!\n', attempt + 1)
        self.initialized = True
示例#2
0
    def _ensure_initialized(self):
        if self.initialized:
            return

        self.workers = [
            MultiAgentEnvWorker(i,
                                self.make_env_func,
                                self.env_config,
                                reset_on_init=self.reset_on_init)
            for i in range(self.num_agents)
        ]

        init_attempt = 0
        while True:
            init_attempt += 1
            try:
                port_to_use = udp_port_num(self.env_config)
                port = find_available_port(port_to_use, increment=1000)
                log.debug('Using port %d', port)
                init_info = dict(port=port)

                lock_file = doom_lock_file(max_parallel=20)
                lock = FileLock(lock_file)
                with lock.acquire(timeout=10):
                    for i, worker in enumerate(self.workers):
                        worker.task_queue.put((init_info, TaskType.INIT))
                        if self.safe_init:
                            time.sleep(1.0)  # just in case
                        else:
                            time.sleep(0.05)

                    for i, worker in enumerate(self.workers):
                        worker.result_queue.get(timeout=5)
                        worker.result_queue.task_done()
                        worker.task_queue.join()
            except filelock.Timeout:
                continue
            except Exception:
                raise RuntimeError(
                    'Critical error: worker stuck on initialization. Abort!')
            else:
                break

        log.debug('%d agent workers initialized for env %d!',
                  len(self.workers), self.env_config.worker_index)
        self.initialized = True
示例#3
0
def init_multiplayer_env(make_env_func, player_id, env_config, init_info=None):
    env = make_env_func(player_id=player_id)

    if env_config is not None and 'worker_index' in env_config:
        env.unwrapped.worker_index = env_config.worker_index
    if env_config is not None and 'vector_index' in env_config:
        env.unwrapped.vector_index = env_config.vector_index

    if init_info is None:
        port_to_use = udp_port_num(env_config)
        port = find_available_port(port_to_use, increment=1000)
        log.debug('Using port %d', port)
        init_info = dict(port=port)

    env.unwrapped.init_info = init_info

    env.seed(env.unwrapped.worker_index * 1000 + env.unwrapped.vector_index * 10 + player_id)
    return env
    def __init__(self,
                 num_envs,
                 num_workers,
                 make_env_func,
                 stats_episodes,
                 use_multiprocessing=True):
        tmp_env = make_env_func(None)
        if hasattr(tmp_env, 'num_agents'):
            self.num_agents = tmp_env.num_agents
        else:
            raise Exception('Expected multi-agent environment')

        global DEFAULT_UDP_PORT
        DEFAULT_UDP_PORT = find_available_port(DEFAULT_UDP_PORT)
        log.debug('Default UDP port changed to %r', DEFAULT_UDP_PORT)
        time.sleep(0.1)

        super().__init__(num_envs, num_workers, make_env_func, stats_episodes,
                         use_multiprocessing)