Tiempos de espera

La biblioteca cliente para Python no especifica ningún tiempo de espera predeterminado, ni se especifican valores predeterminados en la capa de transporte de gRPC. De forma predeterminada, la biblioteca cliente para Python delega el comportamiento de tiempo de espera al servidor.

Este valor predeterminado funciona para la mayoría de los casos de uso. Sin embargo, si necesitas especificar un tiempo de espera del cliente, la biblioteca cliente de Python admite anulaciones de tiempo de espera por solicitud (especificadas en segundos como un int o float) para las llamadas unarias y de transmisión. Los tiempos de espera predeterminados para todo el cliente no se pueden configurar en google-ads.yaml.

Puedes establecer un tiempo de espera personalizado de 2 horas (7,200 segundos) o más, pero la API puede agotar el tiempo de espera de las solicitudes de ejecución extremadamente larga y devolver un error de estado de gRPC DEADLINE_EXCEEDED. Si esto se convierte en un problema, divide la consulta en fragmentos más pequeños y ejecútalos en paralelo. Esto evita la situación en la que falla una solicitud de larga duración y la única forma de recuperarse es reiniciar la solicitud desde el principio.

Tiempos de espera de llamadas de transmisión

El único método de servicio de la API de Google Ads que usa un flujo de respuesta es GoogleAdsService.SearchStream.

Para anular el tiempo de espera predeterminado, pasa el parámetro timeout (en segundos) cuando llames al método:

def make_server_streaming_call(
    client: GoogleAdsClient, customer_id: str
) -> None:
    """Makes a server streaming call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The str Google Ads customer ID.
    """
    ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
    campaign_ids: List[str] = []

    try:
        search_request: SearchGoogleAdsStreamRequest = client.get_type(
            "SearchGoogleAdsStreamRequest"
        )
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        stream: Iterator[SearchGoogleAdsStreamResponse] = (
            ga_service.search_stream(
                request=search_request,
                # When making any request, an optional "timeout" parameter can be
                # provided to specify a client-side response deadline in seconds.
                # If not set, then no timeout will be enforced by the client and
                # the channel will remain open until the response is completed or
                # severed, either manually or by the server.
                timeout=_CLIENT_TIMEOUT_SECONDS,
            )
        )

        batch: SearchGoogleAdsStreamResponse
        for batch in stream:
            row: GoogleAdsRow
            for row in batch.results:
                campaign_ids.append(row.campaign.id)

        print("The server streaming call completed before the timeout.")
    except DeadlineExceeded:
        print("The server streaming call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")
      

Tiempos de espera de llamadas unarias

La mayoría de los métodos de servicio de la API de Google Ads usan llamadas unarias; los ejemplos típicos son GoogleAdsService.Search y GoogleAdsService.Mutate.

Para anular la configuración predeterminada de plazo y reintento de una llamada unaria, pasa un objeto google.api_core.retry.Retry con el parámetro retry (o pasa timeout en segundos para un tiempo de espera de un solo intento):

def make_unary_call(client: GoogleAdsClient, customer_id: str) -> None:
    """Makes a unary call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The Google Ads customer ID.
    """
    ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
    campaign_ids: List[str] = []

    try:
        search_request: SearchGoogleAdsRequest = client.get_type(
            "SearchGoogleAdsRequest"
        )
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        results: Iterator[GoogleAdsRow] = ga_service.search(
            request=search_request,
            # When making any request, an optional "retry" parameter can be
            # provided to specify its retry behavior. Complete information about
            # these settings can be found here:
            # https://googleapis.dev/python/google-api-core/latest/retry.html
            retry=Retry(
                # Sets the maximum accumulative timeout of the call; it
                # includes all tries.
                deadline=_CLIENT_TIMEOUT_SECONDS,
                # Sets the timeout that is used for the first try to one tenth
                # of the maximum accumulative timeout of the call.
                # Note: This overrides the default value and can lead to
                # RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We
                # recommend changing the value only if necessary.
                initial=_CLIENT_TIMEOUT_SECONDS / 10,
                # Sets the maximum timeout that can be used for any given try
                # to one fifth of the maximum accumulative timeout of the call
                # (two times greater than the timeout that is needed for the
                # first try).
                maximum=_CLIENT_TIMEOUT_SECONDS / 5,
            ),
        )

        row: GoogleAdsRow
        for row in results:
            campaign_ids.append(row.campaign.id)

        print("The unary call completed before the timeout.")
    except DeadlineExceeded:
        print("The unary call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")