code: def step(self, action_list):
      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_list = return_list[:, 0]
      reward_list = return_list[:, 1]
      done_list = return_list[:, 2]
      info_list = return_list[:, 3]
  
      for i in range(self.env_num):
          self.episode_steps_list[i] += 1
          info_list[i]["timeout"] = False
  
          if (
              done_list[i]
              or self.episode_steps_list[i] >= self._max_episode_steps
          ):
              if self.episode_steps_list[i] >= self._max_episode_steps:
                  info_list[i]["timeout"] = True
              self.episode_steps_list[i] = 0
              obs_list_i = self.env_list[i].reset()
              next_obs_list[i] = obs_list_i.get()
              next_obs_list[i] = np.array(next_obs_list[i])
      return next_obs_list, reward_list, done_list, info_list
  
imports: import parl
  import carla
  import gym
  import gym_carla
  import numpy
  from parl.env import ActionMappingWrapper
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: next_obs_list,  reward_list,  done_list,  info_list