Hết thời gian chờ

Thư viện ứng dụng cho Python không chỉ định bất kỳ thời gian chờ mặc định nào, cũng như không có giá trị mặc định nào được chỉ định ở tầng truyền tải gRPC. Theo mặc định, thư viện ứng dụng cho Python sẽ uỷ quyền hành vi hết thời gian chờ cho máy chủ.

Giá trị mặc định này phù hợp với hầu hết các trường hợp sử dụng. Tuy nhiên, nếu bạn cần chỉ định thời gian chờ phía máy khách, thì thư viện ứng dụng Python sẽ hỗ trợ ghi đè thời gian chờ theo yêu cầu (được chỉ định bằng giây dưới dạng int hoặc float) cho cả lệnh gọi truyền trực tuyến và lệnh gọi một ngôi. Bạn không thể định cấu hình thời gian chờ mặc định trên toàn ứng dụng trong google-ads.yaml.

Bạn có thể đặt thời gian chờ tuỳ chỉnh thành 2 giờ (7.200 giây) trở lên, nhưng API vẫn có thể hết thời gian chờ đối với các yêu cầu chạy cực kỳ lâu và trả về lỗi trạng thái gRPC DEADLINE_EXCEEDED. Nếu điều này trở thành một vấn đề, hãy chia truy vấn thành các phần nhỏ hơn và thực thi song song; điều này giúp tránh tình huống yêu cầu chạy trong thời gian dài không thành công và cách duy nhất để khôi phục là bắt đầu lại yêu cầu từ đầu.

Hết thời gian chờ cuộc gọi truyền trực tuyến

Phương thức dịch vụ Google Ads API duy nhất sử dụng luồng phản hồi là GoogleAdsService.SearchStream.

Để ghi đè thời gian chờ mặc định, hãy truyền tham số timeout (tính bằng giây) khi gọi phương thức:

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

Thời gian chờ cuộc gọi đơn nguyên

Hầu hết các phương thức dịch vụ của Google Ads API đều sử dụng lệnh gọi một ngôi; ví dụ điển hình là GoogleAdsService.Search và GoogleAdsService.Mutate.

Để ghi đè thời hạn mặc định và thử lại chế độ cài đặt cho một lệnh gọi một ngôi, hãy truyền một đối tượng google.api_core.retry.Retry bằng tham số retry (hoặc truyền timeout tính bằng giây cho thời gian chờ của một lần thử):

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