class_docstr: Launches nodes asynchronously in the background.
class_docstr_tok: ["Launches","nodes","asynchronously","in","the","background","."]
docstr: Collects launch data from queue populated by StandardAutoscaler.
  Launches nodes in a background thread.
  
  Overrides threading.Thread.run().
  NodeLauncher.start() executes this loop in a background thread.
docstr_tok: ["Collects","launch","data","from","queue","populated","by","StandardAutoscaler",".","Launches","nodes","in","a","background","thread",".","Overrides","threading.Thread.run","(",")",".","NodeLauncher.start","(",")","executes","this","loop","in","a","background","thread","."]
code: def run(self):
      """Collects launch data from queue populated by StandardAutoscaler.
      Launches nodes in a background thread.
  
      Overrides threading.Thread.run().
      NodeLauncher.start() executes this loop in a background thread.
      """
      while True:
          config, count, node_type = self.queue.get()
          # launch_node is implemented in BaseNodeLauncher
          self.launch_node(config, count, node_type)
  
imports: import copy
  import logging
  import operator
  import threading
  import time
  import traceback
  from typing import Any, Dict, Optional
  from ray.autoscaler._private.node_provider_availability_tracker import NodeProviderAvailabilityTracker
  from ray.autoscaler._private.prom_metrics import AutoscalerPrometheusMetrics
  from ray.autoscaler._private.util import hash_launch_conf
  from ray.autoscaler.node_launch_exception import NodeLaunchException
  from ray.autoscaler.tags import NODE_KIND_WORKER, STATUS_UNINITIALIZED, TAG_RAY_LAUNCH_CONFIG, TAG_RAY_NODE_KIND, TAG_RAY_NODE_NAME, TAG_RAY_NODE_STATUS, TAG_RAY_USER_NODE_TYPE
label_desc: Use image node_id 2 for calling the NodeLauncher obj's underlying member method code with example usage: obj.run() without return types