code: def step(self, action_list):
      next_obs_list, reward_list, done_list, info_list = [], [], [], []
      if self.use_xparl:
          return_list = [
              self.env_list[i].step(action_list[i])
              for i in range(self.env_num)
          ]
          return_list = [return_.get() for return_ in return_list]
          return_list = np.array(return_list, dtype=object)
  
          next_obs_ = return_list[:, 0]
          reward_ = return_list[:, 1]
          done_ = return_list[:, 2]
          info_ = return_list[:, 3]
  
      for i in range(self.env_num):
          self.total_steps += 1
  
          if self.use_xparl:
              next_obs = next_obs_[i]
              reward = reward_[i]
              done = done_[i]
              info = info_[i]
          else:
              next_obs, reward, done, info = self.env_list[i].step(
                  action_list[i]
              )
  
          self.episode_steps_list[i] += 1
          self.episode_reward_list[i] += reward
  
          if (
              done
              or self.episode_steps_list[i] >= self._max_episode_steps
          ):
              if self.use_xparl:
                  obs = self.env_list[i].reset()
                  next_obs = obs.get()
                  next_obs = np.array(next_obs)
              else:
                  next_obs = self.env_list[i].reset()
              self.episode_steps_list[i] = 0
              self.episode_reward_list[i] = 0
              if self.env_list[i].continuous_action:
                  # get running mean and variance of obs
                  self.eval_ob_rms = self.env_list[i].env.get_ob_rms()
  
          next_obs_list.append(next_obs)
          reward_list.append(reward)
          done_list.append(done)
          info_list.append(info)
      return (
          np.array(next_obs_list),
          np.array(reward_list),
          np.array(done_list),
          np.array(info_list),
      )
  
file_path: PARL/benchmark/torch/ppo/env_utils.py
imports: import parl
  import gym
  import numpy
  from parl.utils import logger
label_desc: Use image node_id 3 for calling the ParallelEnv obj's underlying member method code with example usage: obj.step(action_list) and returns: np,  np,  np,  np