class_docstr: Background thread that updates the local model from sample trajectories.
  
  The learner thread communicates with the main thread through Queues. This
  is needed since Ray operations can only be run on the main thread. In
  addition, moving heavyweight gradient ops session runs off the main thread
  improves overall throughput.
class_docstr_tok: ["Background","thread","that","updates","the","local","model","from","sample","trajectories",".","The","learner","thread","communicates","with","the","main","thread","through","Queues",".","This","is","needed","since","Ray","operations","can","only","be","run","on","the","main","thread",".","In","addition",",","moving","heavyweight","gradient","ops","session","runs","off","the","main","thread","improves","overall","throughput","."]
docstr: Initialize the learner thread.
  
  Args:
      local_worker: process local rollout worker holding
          policies this thread will call learn_on_batch() on
      minibatch_buffer_size: max number of train batches to store
          in the minibatching buffer
      num_sgd_iter: number of passes to learn on per train batch
      learner_queue_size: max size of queue of inbound
          train batches to this thread
      learner_queue_timeout: raise an exception if the queue has
          been empty for this long in seconds
docstr_tok: ["Initialize","the","learner","thread",".","Args",":","local_worker",":","process","local","rollout","worker","holding","policies","this","thread","will","call","learn_on_batch","(",")","on","minibatch_buffer_size",":","max","number","of","train","batches","to","store","in","the","minibatching","buffer","num_sgd_iter",":","number","of","passes","to","learn","on","per","train","batch","learner_queue_size",":","max","size","of","queue","of","inbound","train","batches","to","this","thread","learner_queue_timeout",":","raise","an","exception","if","the","queue","has","been","empty","for","this","long","in","seconds"]
code: def __init__(
      self,
      local_worker: RolloutWorker,
      minibatch_buffer_size: int,
      num_sgd_iter: int,
      learner_queue_size: int,
      learner_queue_timeout: int,
  ):
      """Initialize the learner thread.
  
      Args:
          local_worker: process local rollout worker holding
              policies this thread will call learn_on_batch() on
          minibatch_buffer_size: max number of train batches to store
              in the minibatching buffer
          num_sgd_iter: number of passes to learn on per train batch
          learner_queue_size: max size of queue of inbound
              train batches to this thread
          learner_queue_timeout: raise an exception if the queue has
              been empty for this long in seconds
      """
      threading.Thread.__init__(self)
      self.learner_queue_size = WindowStat("size", 50)
      self.local_worker = local_worker
      self.inqueue = queue.Queue(maxsize=learner_queue_size)
      self.outqueue = queue.Queue()
      self.minibatch_buffer = MinibatchBuffer(
          inqueue=self.inqueue,
          size=minibatch_buffer_size,
          timeout=learner_queue_timeout,
          num_passes=num_sgd_iter,
          init_num_passes=num_sgd_iter,
      )
      self.queue_timer = _Timer()
      self.grad_timer = _Timer()
      self.load_timer = _Timer()
      self.load_wait_timer = _Timer()
      self.daemon = True
      self.policy_ids_updated = []
      self.learner_info = {}
      self.stopped = False
      self.num_steps = 0
  
file_path: ray/python/ray/rllib/execution/learner_thread.py
imports: import copy
  import queue
  import threading
  from typing import Dict, Optional
  from ray.util.timer import _Timer
  from ray.rllib.evaluation.rollout_worker import RolloutWorker
  from ray.rllib.execution.minibatch_buffer import MinibatchBuffer
  from ray.rllib.utils.framework import try_import_tf
  from ray.rllib.utils.metrics.learner_info import LearnerInfoBuilder, LEARNER_INFO
  from ray.rllib.utils.metrics.window_stat import WindowStat
  from ray.util.iter import _NextValueNotReady
label_desc: Use image node_id 1 to create a new LearnerThread object from inherited base classes: threading with example: obj = LearnerThread(local_worker, minibatch_buffer_size, num_sgd_iter, learner_queue_size, learner_queue_timeout)