docstr: Starts a task on the controller that deploys application(s) from a config.
  
  Args:
      config: A single-application config (ServeApplicationSchema) or a
          multi-application config (ServeDeploySchema)
      _blocking: Whether to block until the application is running.
  
  Raises:
      RayTaskError: If the deploy task on the controller fails. This can be
          because a single-app config was deployed after deploying a multi-app
          config, or vice versa.
docstr_tok: ["Starts","a","task","on","the","controller","that","deploys","application","(","s",")","from","a","config",".","Args",":","config",":","A","single-application","config","(","ServeApplicationSchema",")","or","a","multi-application","config","(","ServeDeploySchema",")","_blocking",":","Whether","to","block","until","the","application","is","running",".","Raises",":","RayTaskError",":","If","the","deploy","task","on","the","controller","fails",".","This","can","be","because","a","single-app","config","was","deployed","after","deploying","a","multi-app","config",",","or","vice","versa","."]
code: def deploy_apps(
      self,
      config: Union[ServeApplicationSchema, ServeDeploySchema],
      _blocking: bool = False,
  ) -> None:
      """Starts a task on the controller that deploys application(s) from a config.
  
      Args:
          config: A single-application config (ServeApplicationSchema) or a
              multi-application config (ServeDeploySchema)
          _blocking: Whether to block until the application is running.
  
      Raises:
          RayTaskError: If the deploy task on the controller fails. This can be
              because a single-app config was deployed after deploying a multi-app
              config, or vice versa.
      """
      ray.get(self._controller.deploy_config.remote(config))
  
      if _blocking:
          timeout_s = 60
  
          start = time.time()
          while time.time() - start < timeout_s:
              curr_status = self.get_serve_status()
              if (
                  curr_status.app_status.status
                  == ApplicationStatus.RUNNING
              ):
                  break
              time.sleep(CLIENT_POLLING_INTERVAL_S)
          else:
              raise TimeoutError(
                  f"Serve application isn't running after {timeout_s}s."
              )
  
imports: import logging
  import random
  import time
  from functools import wraps
  from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union
  import ray
  from ray.actor import ActorHandle
  from ray.serve._private.common import ApplicationStatus, DeploymentID, DeploymentStatus, DeploymentStatusInfo, MultiplexedReplicaInfo, StatusOverview
  from ray.serve._private.config import DeploymentConfig, ReplicaConfig
  from ray.serve._private.constants import CLIENT_CHECK_CREATION_POLLING_INTERVAL_S, CLIENT_POLLING_INTERVAL_S, MAX_CACHED_HANDLES, RAY_SERVE_ENABLE_NEW_HANDLE_API, SERVE_DEFAULT_APP_NAME
  from ray.serve._private.controller import ServeController
  from ray.serve._private.deploy_utils import get_deploy_args
  from ray.serve._private.deployment_info import DeploymentInfo
  from ray.serve.config import HTTPOptions
  from ray.serve.exceptions import RayServeException
  from ray.serve.generated.serve_pb2 import DeploymentArgs, DeploymentRoute, DeploymentRouteList
  from ray.serve.generated.serve_pb2 import DeploymentStatusInfo
  from ray.serve.generated.serve_pb2 import StatusOverview
  from ray.serve.handle import DeploymentHandle, RayServeHandle, RayServeSyncHandle
  from ray.serve.schema import LoggingConfig, ServeApplicationSchema, ServeDeploySchema
label_desc: Use image node_id 13 for calling the ServeControllerClient obj's underlying member method code with example usage: obj.deploy_apps(config, _blocking) without return types