class_docstr: ThreadedRayInstaller is responsible for install ray on new nodes.
class_docstr_tok: ["ThreadedRayInstaller","is","responsible","for","install","ray","on","new","nodes","."]
code: def _install_ray_on_new_nodes(self, instance_id: str) -> None:
      allocated_instance, _ = self._instance_storage.get_instances(
          instance_ids={instance_id},
          status_filter={Instance.ALLOCATED},
      )
      for instance in allocated_instance.values():
          self._ray_installation_executor.submit(
              self._install_ray_on_single_node, instance
          )
  
file_path: ray/python/ray/autoscaler/v2/instance_manager/subscribers/threaded_ray_installer.py
imports: import logging
  import time
  from concurrent.futures import ThreadPoolExecutor
  from typing import List
  from ray.autoscaler.v2.instance_manager.instance_storage import InstanceStorage, InstanceUpdatedSubscriber
  from ray.autoscaler.v2.instance_manager.ray_installer import RayInstaller
  from ray.core.generated.instance_manager_pb2 import Instance, InstanceUpdateEvent
label_desc: Use image node_id 3 for calling the ThreadedRayInstaller obj's underlying member method code with example usage: obj._install_ray_on_new_nodes(instance_id) without return types