class_docstr: VectorEnv where each env is run in its own subprocess.
  
  Args:
      env_fns (list of callable): List of callables, each of which
          returns gym.Env that is run in its own subprocess.
class_docstr_tok: ["VectorEnv","where","each","env","is","run","in","its","own","subprocess",".","Args",":","env_fns","(","list","of","callable",")",":","List","of","callables",",","each","of","which","returns","gym.Env","that","is","run","in","its","own","subprocess","."]
code: def __init__(self, env_fns):
      if np.__version__ == "1.16.0":
          warnings.warn(
              """
  NumPy 1.16.0 can cause severe memory leak in pfrl.envs.MultiprocessVectorEnv.
  We recommend using other versions of NumPy.
  See https://github.com/numpy/numpy/issues/12793 for details.
  """
          )  # NOQA
  
      nenvs = len(env_fns)
      self.remotes, self.work_remotes = zip(
          *[Pipe() for _ in range(nenvs)]
      )
      self.ps = [
          Process(target=worker, args=(work_remote, env_fn))
          for (work_remote, env_fn) in zip(self.work_remotes, env_fns)
      ]
      for p in self.ps:
          p.start()
      self.last_obs = [None] * self.num_envs
      self.remotes[0].send(("get_spaces", None))
      self.action_space, self.observation_space = self.remotes[0].recv()
      self.closed = False
  
file_path: pfrl/pfrl/envs/multiprocess_vector_env.py
imports: import signal
  import warnings
  from multiprocessing import Pipe, Process
  import numpy
  from torch.distributions.utils import lazy_property
  import pfrl
label_desc: Use image node_id 1 to create a new MultiprocessVectorEnv object from inherited base classes: pfrl.env with example: obj = MultiprocessVectorEnv(env_fns)