In der Clientbibliothek für Python sind keine Standardzeitlimits angegeben. Auch auf der gRPC-Transportschicht sind keine Standardwerte angegeben. Standardmäßig delegiert die Clientbibliothek für Python das Zeitüberschreitungsverhalten an den Server.
Diese Standardeinstellung ist für die meisten Anwendungsfälle geeignet. Wenn Sie jedoch ein clientseitiges Zeitlimit angeben müssen, unterstützt die Python-Clientbibliothek das Überschreiben von Zeitlimits pro Anfrage (angegeben in Sekunden als int oder float) sowohl für Streaming- als auch für unäre Aufrufe. Clientweite Standardzeitlimits können in google-ads.yaml nicht konfiguriert werden.
Sie können ein benutzerdefiniertes Zeitlimit von 2 Stunden (7.200 Sekunden) oder mehr festlegen. Die API kann jedoch weiterhin extrem lange Anfragen abbrechen und einen gRPC-Statusfehler DEADLINE_EXCEEDED zurückgeben. Wenn dies zu einem Problem wird, teilen Sie die Abfrage in kleinere Teile auf und führen Sie sie parallel aus. So vermeiden Sie, dass eine lang andauernde Anfrage fehlschlägt und die einzige Möglichkeit zur Wiederherstellung darin besteht, die Anfrage von vorn zu starten.
Zeitüberschreitungen bei Streamaufrufen
Die einzige Google Ads API-Dienstmethode, die einen Antwortstream verwendet, ist GoogleAdsService.SearchStream.
Wenn Sie das Standardzeitlimit überschreiben möchten, übergeben Sie beim Aufrufen der Methode den Parameter timeout (in Sekunden):
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)}")
Zeitüberschreitungen bei unären Aufrufen
Die meisten Dienstmethoden der Google Ads API verwenden unäre Aufrufe. Typische Beispiele sind GoogleAdsService.Search und GoogleAdsService.Mutate.
Wenn Sie die Standardeinstellungen für Frist und Wiederholung für einen unären Aufruf überschreiben möchten, übergeben Sie ein google.api_core.retry.Retry-Objekt mit dem Parameter retry (oder übergeben Sie timeout in Sekunden für ein Zeitlimit für einen einzelnen Versuch):
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)}")