La bibliothèque cliente Python ne spécifie pas de délais avant expiration par défaut tous les paramètres par défaut spécifiés au niveau de la couche de transport gRPC. Cela signifie que, par défaut, la bibliothèque cliente pour Python délègue entièrement le comportement du délai avant expiration au serveur.
Cela convient dans la plupart des cas d'utilisation. Toutefois, s'il est nécessaire de spécifier délai avant expiration côté client, la bibliothèque cliente Python prend en charge ce délai pour les appels en streaming et les appels unaires.
Vous pouvez définir le délai avant expiration sur deux heures ou plus, mais il est possible que l'API expire encore
des requêtes de très longue durée et renvoient
Erreur DEADLINE_EXCEEDED
.
Si cela devient un problème, vous pouvez
diviser la requête et exécuter les fragments dans
parallèle ; Cela permet d'éviter qu'une requête de longue durée échoue et
le seul moyen de récupérer est
de relancer la demande.
Délais avant expiration des appels en streaming
La seule méthode de service de l'API Google Ads qui utilise ce type d'appel est
GoogleAdsService.SearchStream
Pour ignorer le délai par défaut, vous devez ajouter un paramètre supplémentaire lors de l'appel la méthode:
def make_server_streaming_call(client, customer_id): """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 = client.get_service("GoogleAdsService") campaign_ids = [] try: search_request = client.get_type("SearchGoogleAdsStreamRequest") search_request.customer_id = customer_id search_request.query = _QUERY stream = 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, ) for batch in stream: for row in batch.results: campaign_ids.append(row.campaign.id) print("The server streaming call completed before the timeout.") except DeadlineExceeded as ex: 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)}")
Délais avant expiration des appels unaires
La plupart des méthodes de service de l'API Google Ads utilisent des appels unaires. des exemples typiques sont
GoogleAdsService.Search
et
GoogleAdsService.Mutate
Pour ignorer le délai par défaut, vous devez ajouter un paramètre supplémentaire lors de l'appel la méthode:
def make_unary_call(client, customer_id): """Makes a unary call using a custom client timeout. Args: client: An initialized GoogleAds client. customer_id: The Google Ads customer ID. """ ga_service = client.get_service("GoogleAdsService") campaign_ids = [] try: search_request = client.get_type("SearchGoogleAdsRequest") search_request.customer_id = customer_id search_request.query = _QUERY results = 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, ), ) for row in results: campaign_ids.append(row.campaign.id) print("The unary call completed before the timeout.") except DeadlineExceeded as ex: 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)}")