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 mọi giá trị mặc định được chỉ định ở tầng truyền tải gRPC. Điều này có nghĩa là, theo mặc định, thư viện ứng dụng cho Python uỷ quyền hoàn toàn hành vi hết thời gian chờ cho máy chủ.
Điều này là đủ cho hầu hết các trường hợp sử dụng; tuy nhiên, nếu cần chỉ định hết thời gian chờ phía máy khách, thư viện ứng dụng cho Python không hỗ trợ thời gian chờ ghi đè cho cả lệnh gọi phát trực tuyến và lệnh gọi đơn phân.
Bạn có thể đặt thời gian chờ thành 2 giờ trở lên, nhưng API vẫn có thể hết thời gian chờ
các yêu cầu cực kỳ dài hạn và trả về một
Lỗi DEADLINE_EXCEEDED
.
Nếu đây là vấn đề, bạn có thể chia nhỏ truy vấn và thực thi các đoạn trong
song song; điều này giúp tránh trường hợp một 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.
Thời gian chờ cuộc gọi truyền trực tuyến
Phương thức dịch vụ API Google Ads duy nhất sử dụng loại lệnh gọi này là
GoogleAdsService.SearchStream
.
Để ghi đè thời gian chờ mặc định, bạn cần thêm một tham số bổ sung khi gọi phương thức:
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)}")
Thời gian chờ lệnh gọi một lần
Hầu hết phương thức dịch vụ API Google Ads đều sử dụng lệnh gọi đơn phân; ví dụ điển hình là
GoogleAdsService.Search
và
GoogleAdsService.Mutate
.
Để ghi đè thời gian chờ mặc định, bạn cần thêm một tham số bổ sung khi gọi phương thức:
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)}")