def __init__(self, env_fns, start_method=None): self.waiting = False self.closed = False n_envs = len(env_fns) if start_method is None: # Fork is not a thread safe method (see issue #217) # but is more user friendly (does not require to wrap the code in # a `if __name__ == "__main__":`) fork_available = 'fork' in multiprocessing.get_all_start_methods() start_method = 'fork' if fork_available else 'spawn' ctx = multiprocessing.get_context(start_method) self.remotes, self.work_remotes = zip( *[ctx.Pipe() for _ in range(n_envs)]) self.processes = [] for work_remote, remote, env_fn in zip(self.work_remotes, self.remotes, env_fns): args = (work_remote, remote, CloudpickleWrapper(env_fn)) # daemon=True: if the main process crashes, we should not cause things to hang process = ctx.Process(target=_worker, args=args, daemon=True) process.start() self.processes.append(process) work_remote.close() self.remotes[0].send(('get_spaces', None)) observation_space, action_space = self.remotes[0].recv() VecEnv.__init__(self, len(env_fns), observation_space, action_space)
def __init__(self, env_fns, start_method=None): self.waiting = False self.closed = False n_envs = len(env_fns) if start_method is None: # Use thread safe method, see issue #217. # forkserver faster than spawn but not always available. forkserver_available = 'forkserver' in multiprocessing.get_all_start_methods() start_method = 'forkserver' if forkserver_available else 'spawn' ctx = multiprocessing.get_context(start_method) self.remotes, self.work_remotes = zip(*[ctx.Pipe() for _ in range(n_envs)]) self.processes = [] for work_remote, remote, env_fn in zip(self.work_remotes, self.remotes, env_fns): args = (work_remote, remote, CloudpickleWrapper(env_fn)) # daemon=True: if the main process crashes, we should not cause things to hang process = ctx.Process(target=_worker, args=args, daemon=True) process.start() self.processes.append(process) work_remote.close() self.remotes[0].send(('get_spaces', None)) observation_space, action_space = self.remotes[0].recv() VecEnv.__init__(self, len(env_fns), observation_space, action_space)
def __init__(self, env_id, n_agents): env_path = UnityVecEnv.GetFilePath(env_id, n_agents=n_agents) print("**** ", env_path) env = UnityEnv(env_path, multiagent=True) self.env = env env.num_envs = env.number_agents VecEnv.__init__(self, env.num_envs, env.observation_space, env.action_space) obs_space = env.observation_space # self.keys, shapes, dtypes = obs_space_info(obs_space) # self.buf_obs = { k: np.zeros((self.num_envs,) + tuple(shapes[k]), dtype=dtypes[k]) for k in self.keys } # self.buf_dones = np.zeros((self.num_envs,), dtype=np.bool) # self.buf_rews = np.zeros((self.num_envs,), dtype=np.float32) self.buf_infos = [{} for _ in range(self.num_envs)] # Fake Monitor self.tstart = time.time() self.results_writer = ResultsWriter("filename", header={ "t_start": time.time(), 'env_id': env.spec and env.spec.id }, extra_keys=() + ()) self.reset_keywords = () self.info_keywords = () self.allow_early_resets = True self.rewards = None self.needs_reset = True self.episode_rewards = [] self.episode_lengths = [] self.episode_times = [] self.total_steps = 0 self.current_reset_info = { } # extra info about the current episode, that was passed in during reset()
def __init__(self, env_fns): """ :param env_fns: ([function]) """ assert len(env_fns) == 1, "This dummy class does not support multiprocessing" self.envs = [fn() for fn in env_fns] env = self.envs[0] VecEnv.__init__(self, len(env_fns), env.observation_space, env.action_space) self.env = self.envs[0] self.actions = None self.obs = None self.reward, self.done, self.infos = None, None, None
def __init__(self, env_fns, start_method=None): """ @brief Constructor @warning Only 'forkserver' and 'spawn' start methods are thread-safe, which is important when TensorFlow sessions or other non thread-safe libraries are used in the parent. However, compared to 'fork' they incur a small start-up cost and have restrictions on global variables. With those methods, users must wrap the code in an ``if __name__ == "__main__":`` For more information, see the multiprocessing documentation. @param[in] env_fns List of Gym Environments to run in subprocesses @param[in] start_method Method used to start the subprocesses. Must be one of the methods returned by multiprocessing.get_all_start_methods(). Optional: Defaults to 'fork' on available platforms, and 'spawn' otherwise. @return Instance of SubprocVecEnvLock. """ global lock self.waiting = False self.closed = False n_envs = len(env_fns) if start_method is None: # Fork is not a thread safe method (see issue #217) # but is more user friendly (does not require to wrap the code in # a `if __name__ == "__main__":`) fork_available = 'fork' in multiprocessing.get_all_start_methods() start_method = 'fork' if fork_available else 'spawn' ctx = multiprocessing.get_context(start_method) self.remotes, self.work_remotes = zip( *[ctx.Pipe() for _ in range(n_envs)]) self.processes = [] for work_remote, remote, env_fn in zip(self.work_remotes, self.remotes, env_fns): args = (work_remote, remote, CloudpickleWrapper(env_fn), lock) # daemon=True: if the main process crashes, we should not cause things to hang process = ctx.Process(target=_worker, args=args, daemon=True) process.start() self.processes.append(process) work_remote.close() self.remotes[0].send(('get_spaces', None)) observation_space, action_space = self.remotes[0].recv() VecEnv.__init__(self, len(env_fns), observation_space, action_space)
def __init__(self, env_fns, **env_args): self.envs = [fn(**env_args) for fn in env_fns] env = self.envs[0] VecEnv.__init__(self, len(env_fns), env.observation_space, env.action_space) obs_space = env.observation_space self.keys, shapes, dtypes = obs_space_info(obs_space) self.buf_obs = OrderedDict([(k, np.zeros( (self.num_envs, ) + tuple(shapes[k]), dtype=dtypes[k])) for k in self.keys]) self.buf_dones = np.zeros((self.num_envs, ), dtype=np.bool) self.buf_rews = np.zeros((self.num_envs, ), dtype=np.float32) self.buf_infos = [{} for _ in range(self.num_envs)] self.actions = None
def __init__(self, env_fns): self.waiting = False self.closed = False n_envs = len(env_fns) self.remotes, self.work_remotes = zip(*[Pipe() for _ in range(n_envs)]) self.processes = [Process(target=_worker, args=(work_remote, remote, CloudpickleWrapper(env_fn))) for (work_remote, remote, env_fn) in zip(self.work_remotes, self.remotes, env_fns)] for process in self.processes: process.daemon = True # if the main process crashes, we should not cause things to hang process.start() for remote in self.work_remotes: remote.close() self.remotes[0].send(('get_spaces', None)) observation_space, action_space = self.remotes[0].recv() VecEnv.__init__(self, len(env_fns), observation_space, action_space)
def __init__(self, env_fns, create_method): self.waiting = False self.closed = False n_envs = len(env_fns) self.remotes, self.work_remotes = zip( *[create_pipe() for _ in range(n_envs)]) self.processes = [] for work_remote, env_fn in zip(self.work_remotes, env_fns): args = (work_remote, CloudpickleWrapper(env_fn)) # daemon=True: if the main process crashes, we should not cause # things to hang process = create_method(target=_worker, args=args, daemon=True) process.start() self.processes.append(process) self.remotes[0].send(('get_spaces', None)) observation_space, action_space = self.remotes[0].recv() VecEnv.__init__(self, len(env_fns), observation_space, action_space)
def __init__(self, num_envs, num_agents, observation_space, action_space): VecEnv.__init__(self, num_envs, observation_space, action_space) self.num_agents = num_agents