La libreria client per Python non specifica timeout predefiniti, né vengono specificati valori predefiniti nel livello di trasporto gRPC. Per impostazione predefinita, la libreria client per Python delega il comportamento di timeout al server.
Questa impostazione predefinita è adatta alla maggior parte dei casi d'uso. Tuttavia, se devi specificare un timeout lato client, la libreria client Python supporta gli override del timeout per richiesta (specificati in secondi come int o float) sia per le chiamate in modalità flusso che per quelle unarie. I timeout predefiniti a livello di client non possono essere configurati in
google-ads.yaml.
Puoi impostare un timeout personalizzato su 2 ore (7200 secondi) o più, ma l'API potrebbe comunque scadere per richieste con tempi di esecuzione estremamente lunghi e restituire un errore di stato gRPC DEADLINE_EXCEEDED. Se questo diventa un problema, suddividi la query in blocchi più piccoli ed eseguili in parallelo. In questo modo eviti la situazione in cui una richiesta con un tempo di esecuzione lungo non va a buon fine e l'unico modo per recuperarla è riavviarla dall'inizio.
Timeout delle chiamate in streaming
L'unico metodo del servizio API Google Ads che utilizza uno stream di risposta è
GoogleAdsService.SearchStream.
Per eseguire l'override del timeout predefinito, passa il parametro timeout (in secondi) quando chiami il metodo:
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)}")
Timeout delle chiamate unarie
La maggior parte dei metodi di servizio dell'API Google Ads utilizza chiamate unarie; esempi tipici sono
GoogleAdsService.Search e
GoogleAdsService.Mutate.
Per eseguire l'override delle impostazioni predefinite di scadenza e nuovo tentativo per una chiamata unaria, passa un oggetto google.api_core.retry.Retry utilizzando il parametro retry (o passa timeout in secondi per un timeout di un singolo tentativo):
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)}")