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 notify(self, events: List[InstanceUpdateEvent]) -> None:
      for event in events:
          if event.new_instance_status == Instance.ALLOCATED:
              self._install_ray_on_new_nodes(event.instance_id)
  
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 2 for calling the ThreadedRayInstaller obj's underlying member method code with example usage: obj.notify(events) without return types