code: def shutdown(exiting_interpreter=False):
      
      if exiting_interpreter and global_worker.mode == SCRIPT_MODE:
          # This is a duration to sleep before shutting down everything in order
          # to make sure that log messages finish printing.
          time.sleep(0.5)
  
      disconnect()
  
      # Disconnect global state from GCS.
      global_state.disconnect()
  
      # Shut down the Ray processes.
      global _global_node
      if _global_node is not None:
          _global_node.kill_all_processes(check_alive=False, allow_graceful=True)
          _global_node = None
  
      global_worker.set_mode(None)
docs: Disconnect the worker, and terminate processes started by ray.init().
  
      This will automatically run at the end when a Python process that uses Ray
      exits. It is ok to run this twice in a row. The primary use case for this
      function is to cleanup state between tests.
  
      Note that this will clear any remote function definitions, actor
      definitions, and existing actors, so if you wish to use any previously
      defined remote functions or actors after calling ray.shutdown(), then you
      need to redefine them. If they were defined in an imported module, then you
      will need to reload the module.
  
      Args:
          exiting_interpreter (bool): True if this is called by the atexit hook
              and false otherwise. If we are exiting the interpreter, we will
              wait a little while to print any extra error messages.