제한 시간

Python용 클라이언트 라이브러리는 기본 제한 시간을 지정하지 않으며 gRPC 전송 계층에서 기본값을 지정하지 않습니다. 즉, 기본적으로 Python용 클라이언트 라이브러리는 시간 제한 동작을 서버에 완전히 위임합니다.

이는 대부분의 사용 사례에 적합합니다. 하지만 클라이언트 측 시간 제한을 지정해야 하는 경우 Python용 클라이언트 라이브러리는 스트리밍 및 단항 호출 모두에 대해 시간 제한 재정의를 지원합니다.

제한 시간을 2시간 이상으로 설정할 수 있지만 API가 여전히 장기 실행 요청 시간이 초과되고 DEADLINE_EXCEEDED 오류를 반환할 수 있습니다. 이 문제가 발생하면 쿼리를 분할하고 청크를 동시에 실행할 수 있습니다. 이렇게 하면 장기 실행 요청이 실패하는 상황을 피할 수 있고 복구는 요청을 다시 시작하는 것뿐입니다.

스트리밍 통화 시간 제한

이 유형의 호출을 사용하는 유일한 Google Ads API 서비스 메서드는 GoogleAdsService.SearchStream입니다.

기본 시간 제한을 재정의하려면 메서드를 호출할 때 별도의 매개변수를 추가해야 합니다.

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)}")
      

단항 호출 시간 제한

대부분의 Google Ads API 서비스 메서드는 단항 호출을 사용합니다. 일반적인 예로는 GoogleAdsService.SearchGoogleAdsService.Mutate가 있습니다.

기본 시간 제한을 재정의하려면 메서드를 호출할 때 별도의 매개변수를 추가해야 합니다.

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)}")