class_docstr: InstanceLauncher is responsible for provisioning new instances.
code: def __init__(
      self,
      instance_storage: InstanceStorage,
      node_provider: NodeProvider,
      max_concurrent_requests: int = math.ceil(
          AUTOSCALER_MAX_CONCURRENT_LAUNCHES
          / float(AUTOSCALER_MAX_LAUNCH_BATCH)
      ),
      max_instances_per_request: int = AUTOSCALER_MAX_LAUNCH_BATCH,
  ) -> None:
      self._instance_storage = instance_storage
      self._node_provider = node_provider
      self._max_concurrent_requests = max_concurrent_requests
      self._max_instances_per_request = max_instances_per_request
      self._executor = ThreadPoolExecutor(max_workers=1)
      self._launch_instance_executor = ThreadPoolExecutor(
          max_workers=self._max_concurrent_requests
      )
  
file_path: ray/python/ray/autoscaler/v2/instance_manager/subscribers/instance_launcher.py
imports: import logging
  import math
  from collections import defaultdict
  from concurrent.futures import ThreadPoolExecutor
  from typing import List
  from ray.autoscaler._private.constants import AUTOSCALER_MAX_CONCURRENT_LAUNCHES, AUTOSCALER_MAX_LAUNCH_BATCH
  from ray.autoscaler.v2.instance_manager.instance_storage import InstanceStorage, InstanceUpdatedSubscriber
  from ray.autoscaler.v2.instance_manager.node_provider import NodeProvider
  from ray.core.generated.instance_manager_pb2 import Instance, InstanceUpdateEvent
label_desc: Use image node_id 1 to create a new InstanceLauncher object from inherited base classes: InstanceUpdatedSubscriber with example: obj = InstanceLauncher(instance_storage, node_provider, max_concurrent_requests, max_instances_per_request)