Python용 클라이언트 라이브러리는 기본 제한 시간을 지정하지 않으며 gRPC 전송 계층에서도 기본값이 지정되지 않습니다. 기본적으로 Python용 클라이언트 라이브러리는 제한 시간 동작을 서버에 위임합니다.
이 기본값은 대부분의 사용 사례에 적합합니다. 그러나 클라이언트 측 제한 시간을 지정해야 하는 경우 Python 클라이언트 라이브러리는 스트리밍 및 단항 호출 모두에 대해 요청별 제한 시간 재정의 (int 또는 float로 초 단위로 지정)를 지원합니다. 클라이언트 전체 기본 제한 시간은 google-ads.yaml에서 구성할 수 없습니다.
맞춤 제한 시간을 2시간 (7,200초) 이상으로 설정할 수 있지만 API
는 장기 실행 요청의 제한 시간을 초과하고
DEADLINE_EXCEEDED gRPC 상태 오류를 반환할 수 있습니다. 이 문제가 발생하면 쿼리를 더 작은 청크로 분할하고 병렬로 실행합니다. 이렇게 하면 장기 실행 요청이 실패하고 복구하는 유일한 방법이 처음부터 요청을 다시 시작하는 상황을 방지할 수 있습니다.
스트림 호출 제한 시간
응답 스트림을 사용하는 유일한 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)}")