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
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
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)