超时
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
Python 客户端库未指定任何默认超时时间,并且 gRPC 传输层也未指定任何默认超时时间。这意味着,默认情况下,Python 版客户端库会将超时行为完全委托给服务器。
这足以满足大多数使用情形;不过,如果需要指定客户端超时时间,Python 版客户端库支持针对流式传输调用和一元调用的超时时间替换。
您可以将超时时间设置为 2 小时或更长时间,但 API 仍可能会使运行时间极长的请求超时,并返回 DEADLINE_EXCEEDED
错误。
如果这成为一个问题,您可以拆分查询并并行执行各个部分;这样可以避免长时间运行的请求失败,而唯一的恢复方法是重新启动请求的情况。
流式传输通话超时
唯一使用此类调用的 Google Ads API 服务方法是 GoogleAdsService.SearchStream
。
如需替换默认超时时间,您需要在调用该方法时添加一个额外的参数:
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
。
如需替换默认超时时间,您需要在调用该方法时添加一个额外的参数:
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)}")
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-27。
[null,null,["最后更新时间 (UTC):2025-08-27。"],[[["\u003cp\u003eThe Google Ads client library for Python does not set default timeouts, relying on server-side timeouts.\u003c/p\u003e\n"],["\u003cp\u003eClient-side timeouts can be set to override this default behavior for both streaming and unary calls using a \u003ccode\u003etimeout\u003c/code\u003e parameter.\u003c/p\u003e\n"],["\u003cp\u003eWhile timeouts can be extended to 2 hours or more, extremely long API requests might still encounter \u003ccode\u003eDEADLINE_EXCEEDED\u003c/code\u003e errors and may require splitting into smaller, parallel requests.\u003c/p\u003e\n"],["\u003cp\u003eStreaming calls, such as \u003ccode\u003eGoogleAdsService.SearchStream\u003c/code\u003e, use a direct \u003ccode\u003etimeout\u003c/code\u003e parameter for client-side timeout enforcement.\u003c/p\u003e\n"],["\u003cp\u003eUnary calls, like \u003ccode\u003eGoogleAdsService.Search\u003c/code\u003e and \u003ccode\u003eGoogleAdsService.Mutate\u003c/code\u003e, leverage a \u003ccode\u003eretry\u003c/code\u003e parameter with a \u003ccode\u003edeadline\u003c/code\u003e for timeout control, and can further fine-tune initial and maximum timeout per try.\u003c/p\u003e\n"]]],[],null,["# Timeouts\n\nThe client library for Python doesn't specify any default timeouts, nor are\nany defaults specified at the gRPC transport layer. This means that, by default,\nthe client library for Python fully delegates timeout behavior to the server.\n\nThis is adequate for most use cases; however, if it's necessary to specify a\nclient-side timeout, the client library for Python does support timeout\noverrides for both streaming and unary calls.\n\nYou can set the timeout to 2 hours or more, but the API might still time out\nextremely long-running requests and return a\n[`DEADLINE_EXCEEDED`](/google-ads/api/reference/rpc/v21/InternalErrorEnum.InternalError) error.\nIf this becomes an issue, you can split up the query and execute the chunks in\nparallel; this avoids the situation where a long-running request fails and the\nonly way to recover is to restart the request.\n\nStreaming call timeouts\n-----------------------\n\nThe only Google Ads API service method that uses this type of call is\n[`GoogleAdsService.SearchStream`](/google-ads/api/reference/rpc/v21/GoogleAdsService/SearchStream).\n\nTo override the default timeout, you need to add an extra parameter when calling\nthe method:\n\n\n```python\ndef make_server_streaming_call(\n client: GoogleAdsClient, customer_id: str\n) -\u003e None:\n \"\"\"Makes a server streaming call using a custom client timeout.\n\n Args:\n client: An initialized GoogleAds client.\n customer_id: The str Google Ads customer ID.\n \"\"\"\n ga_service: GoogleAdsServiceClient = client.get_service(\"GoogleAdsService\")\n campaign_ids: List[str] = []\n\n try:\n search_request: SearchGoogleAdsStreamRequest = client.get_type(\n \"SearchGoogleAdsStreamRequest\"\n )\n search_request.customer_id = customer_id\n search_request.query = _QUERY\n stream: Iterator[SearchGoogleAdsStreamResponse] = (\n ga_service.search_stream(\n request=search_request,\n # When making any request, an optional \"timeout\" parameter can be\n # provided to specify a client-side response deadline in seconds.\n # If not set, then no timeout will be enforced by the client and\n # the channel will remain open until the response is completed or\n # severed, either manually or by the server.\n timeout=_CLIENT_TIMEOUT_SECONDS,\n )\n )\n\n batch: SearchGoogleAdsStreamResponse\n for batch in stream:\n row: GoogleAdsRow\n for row in batch.results:\n campaign_ids.append(row.campaign.id)\n\n print(\"The server streaming call completed before the timeout.\")\n except DeadlineExceeded:\n print(\"The server streaming call did not complete before the timeout.\")\n sys.exit(1)\n except GoogleAdsException as ex:\n print(\n f\"Request with ID '{ex.request_id}' failed with status \"\n f\"'{ex.error.code().name}' and includes the following errors:\"\n )\n for error in ex.failure.errors:\n print(f\"\\tError with message '{error.message}'.\")\n if error.location:\n for field_path_element in error.location.field_path_elements:\n print(f\"\\t\\tOn field: {field_path_element.field_name}\")\n sys.exit(1)\n\n print(f\"Total # of campaign IDs retrieved: {len(campaign_ids)}\")https://github.com/googleads/google-ads-python/blob/d0595698b8a7de6cc00684b467462601037c9db9/examples/misc/set_custom_client_timeouts.py#L57-L109\n \n```\n\n\u003cbr /\u003e\n\nUnary call timeouts\n-------------------\n\nMost of the Google Ads API service methods use unary calls; typical examples are\n[`GoogleAdsService.Search`](/google-ads/api/reference/rpc/v21/GoogleAdsService/Search) and\n[`GoogleAdsService.Mutate`](/google-ads/api/reference/rpc/v21/GoogleAdsService/Mutate).\n\nTo override the default timeout, you need to add an extra parameter when calling\nthe method:\n\n\n```python\ndef make_unary_call(client: GoogleAdsClient, customer_id: str) -\u003e None:\n \"\"\"Makes a unary call using a custom client timeout.\n\n Args:\n client: An initialized GoogleAds client.\n customer_id: The Google Ads customer ID.\n \"\"\"\n ga_service: GoogleAdsServiceClient = client.get_service(\"GoogleAdsService\")\n campaign_ids: List[str] = []\n\n try:\n search_request: SearchGoogleAdsRequest = client.get_type(\n \"SearchGoogleAdsRequest\"\n )\n search_request.customer_id = customer_id\n search_request.query = _QUERY\n results: Iterator[GoogleAdsRow] = ga_service.search(\n request=search_request,\n # When making any request, an optional \"retry\" parameter can be\n # provided to specify its retry behavior. Complete information about\n # these settings can be found here:\n # https://googleapis.dev/python/google-api-core/latest/retry.html\n retry=Retry(\n # Sets the maximum accumulative timeout of the call; it\n # includes all tries.\n deadline=_CLIENT_TIMEOUT_SECONDS,\n # Sets the timeout that is used for the first try to one tenth\n # of the maximum accumulative timeout of the call.\n # Note: This overrides the default value and can lead to\n # RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We\n # recommend changing the value only if necessary.\n initial=_CLIENT_TIMEOUT_SECONDS / 10,\n # Sets the maximum timeout that can be used for any given try\n # to one fifth of the maximum accumulative timeout of the call\n # (two times greater than the timeout that is needed for the\n # first try).\n maximum=_CLIENT_TIMEOUT_SECONDS / 5,\n ),\n )\n\n row: GoogleAdsRow\n for row in results:\n campaign_ids.append(row.campaign.id)\n\n print(\"The unary call completed before the timeout.\")\n except DeadlineExceeded:\n print(\"The unary call did not complete before the timeout.\")\n sys.exit(1)\n except GoogleAdsException as ex:\n print(\n f\"Request with ID '{ex.request_id}' failed with status \"\n f\"'{ex.error.code().name}' and includes the following errors:\"\n )\n for error in ex.failure.errors:\n print(f\"\\tError with message '{error.message}'.\")\n if error.location:\n for field_path_element in error.location.field_path_elements:\n print(f\"\\t\\tOn field: {field_path_element.field_name}\")\n sys.exit(1)\n\n print(f\"Total # of campaign IDs retrieved: {len(campaign_ids)}\")https://github.com/googleads/google-ads-python/blob/d0595698b8a7de6cc00684b467462601037c9db9/examples/misc/set_custom_client_timeouts.py#L114-L174\n \n```\n\n\u003cbr /\u003e"]]