В клиентской библиотеке для Python не заданы значения времени ожидания по умолчанию. Они также не указаны на транспортном уровне gRPC. По умолчанию клиентская библиотека для Python делегирует поведение при тайм-ауте серверу.
Это значение по умолчанию подходит для большинства случаев. Однако если вам нужно указать время ожидания на стороне клиента, клиентская библиотека Python поддерживает переопределение времени ожидания для каждого запроса (указывается в секундах как int или float) как для потоковых, так и для унарных вызовов. В google-ads.yaml нельзя настроить время ожидания по умолчанию для всех клиентов.
Вы можете задать собственное время ожидания,равное двум часам (7200 секундам) или более, но API все равно может прерывать выполнение слишком долгих запросов и возвращать ошибку статуса gRPC DEADLINE_EXCEEDED. Если это станет проблемой, разделите запрос на несколько частей и выполняйте их параллельно. Это позволит избежать ситуации, когда длительный запрос завершается ошибкой и единственный способ восстановить его – перезапустить запрос с самого начала.
Тайм-ауты вызовов потока
Единственный метод сервиса Google Ads API, который использует поток ответов, – это GoogleAdsService.SearchStream.
Чтобы переопределить время ожидания по умолчанию, передайте параметр timeout (в секундах) при вызове метода:
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)}")
Время ожидания унарных вызовов
Большинство методов сервиса Google Ads API используют унарные вызовы. Типичные примеры – GoogleAdsService.Search и GoogleAdsService.Mutate.
Чтобы переопределить срок по умолчанию и повторить настройки для унарного вызова, передайте объект google.api_core.retry.Retry с помощью параметра retry (или передайте timeout в секундах для тайм-аута одной попытки):
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)}")