docstr: 1. kick off all actors to synchronize parameters and sample data;
  2. collect sample data of all actors;
  3. update parameters.
docstr_tok: ["1.","kick","off","all","actors","to","synchronize","parameters","and","sample","data",";","2.","collect","sample","data","of","all","actors",";","3.","update","parameters","."]
code: def step(self):
      """
      1. kick off all actors to synchronize parameters and sample data;
      2. collect sample data of all actors;
      3. update parameters.
      """
  
      latest_params = self.agent.get_weights()
      for params_queue in self.params_queues:
          params_queue.put(latest_params)
  
      train_batch = defaultdict(list)
      for i in range(self.config["actor_num"]):
          sample_data = self.sample_data_queue.get()
          for key, value in sample_data.items():
              train_batch[key].append(value)
  
          self.sample_total_steps += sample_data["obs"].shape[0]
  
      for key, value in train_batch.items():
          train_batch[key] = np.concatenate(value)
  
      with self.learn_time_stat:
          (
              total_loss,
              pi_loss,
              vf_loss,
              entropy,
              lr,
              entropy_coeff,
          ) = self.agent.learn(
              obs_np=train_batch["obs"],
              actions_np=train_batch["actions"],
              advantages_np=train_batch["advantages"],
              target_values_np=train_batch["target_values"],
          )
  
      self.total_loss_stat.add(total_loss)
      self.pi_loss_stat.add(pi_loss)
      self.vf_loss_stat.add(vf_loss)
      self.entropy_stat.add(entropy)
      self.lr = lr
      self.entropy_coeff = entropy_coeff
  
imports: from parl.utils import check_version_for_fluid
  import gym
  import numpy
  import os
  from six.moves import queue
  import six
  import time
  import threading
  import parl
  from atari_model import AtariModel
  from atari_agent import AtariAgent
  from collections import defaultdict
  from parl.env.atari_wrappers import wrap_deepmind
  from parl.utils import logger, get_gpu_count, summary
  from parl.utils.scheduler import PiecewiseScheduler
  from parl.utils.time_stat import TimeStat
  from parl.utils.window_stat import WindowStat
  from parl.utils import machine_info
  from actor import Actor
label_desc: Use image node_id 4 for calling the Learner obj's underlying member method code with example usage: obj.step() without return types