스트리밍 반복기
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
GoogleAdsService.search_stream
를 호출하면 스트리밍 응답 반복자가 반환됩니다. 이 반복자는 스트림이 중단되거나 세그먼트 오류가 발생하지 않도록 사용되는 동안 GoogleAdsService
클라이언트와 동일한 범위에 있어야 합니다. 열린 GoogleAdsService
객체가 범위를 벗어나면 gRPC Channel
객체가 가비지 컬렉션되기 때문입니다.
search_stream
결과에 대한 반복이 발생할 때 GoogleAdsService
객체가 더 이상 범위에 없으면 Channel
객체가 이미 소멸되어 있을 수 있으므로 반복자가 다음 값을 가져오려고 할 때 정의되지 않은 동작이 발생합니다.
다음 코드는 스트리밍 반복자의 잘못된 사용법을 보여줍니다.
def stream_response(client, customer_id, query):
return client.get_service("GoogleAdsService", version="v21").search_stream(customer_id, query=query)
def main(client, customer_id):
query = "SELECT campaign.name FROM campaign LIMIT 10"
response = stream_response(client, customer_id, query=query)
# Access the iterator in a different scope from where the service object was created.
try:
for batch in response:
# Iterate through response, expect undefined behavior.
위 코드에서 GoogleAdsService
객체는 반복자가 액세스되는 범위와 다른 범위 내에서 생성됩니다. 따라서 반복자가 전체 응답을 소비하기 전에 Channel
객체가 소멸될 수 있습니다.
대신 스트리밍 반복자는 사용되는 동안 GoogleAdsService
클라이언트와 동일한 범위에 유지되어야 합니다.
def main(client, customer_id):
ga_service = client.get_service("GoogleAdsService", version="v21")
query = "SELECT campaign.name FROM campaign LIMIT 10"
response = ga_service.search_stream(customer_id=customer_id, query=query)
# Access the iterator in the same scope as where the service object was created.
try:
for batch in response:
# Successfully iterate through response.
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2025-08-27(UTC)
[null,null,["최종 업데이트: 2025-08-27(UTC)"],[[["\u003cp\u003eWhen using \u003ccode\u003eGoogleAdsService.search_stream\u003c/code\u003e, the streaming response iterator must remain in the same scope as the \u003ccode\u003eGoogleAdsService\u003c/code\u003e client to prevent stream disruptions or segmentation faults.\u003c/p\u003e\n"],["\u003cp\u003eThis is because the underlying gRPC \u003ccode\u003eChannel\u003c/code\u003e object can be garbage-collected if the \u003ccode\u003eGoogleAdsService\u003c/code\u003e object goes out of scope before the iterator is fully consumed.\u003c/p\u003e\n"],["\u003cp\u003eAccessing the iterator in a different scope may lead to undefined behavior as the \u003ccode\u003eChannel\u003c/code\u003e might be destroyed prematurely.\u003c/p\u003e\n"],["\u003cp\u003eEnsure the iterator is used within the same scope where the \u003ccode\u003eGoogleAdsService\u003c/code\u003e object is created to guarantee successful iteration through the response.\u003c/p\u003e\n"]]],[],null,["# Streaming Iterators\n\nWhen calling\n[`GoogleAdsService.search_stream`](/google-ads/api/reference/rpc/v21/GoogleAdsService/SearchStream),\na streaming response iterator is returned. This iterator should remain in the\nsame scope as the `GoogleAdsService` client while being used in order to avoid\nbroken streams or segmentation faults. This is because the gRPC `Channel` object\nis garbage-collected once the open `GoogleAdsService` object goes out of scope.\nIf the `GoogleAdsService` object is no longer in scope by the time the iteration\noccurs on the result of `search_stream`, the `Channel` object may already be\ndestroyed, causing undefined behavior when the iterator attempts to retrieve the\nnext value.\n\nThe following code demonstrates *incorrect* usage of streaming iterators: \n\n def stream_response(client, customer_id, query):\n return client.get_service(\"GoogleAdsService\", version=\"v21\").search_stream(customer_id, query=query)\n\n def main(client, customer_id):\n query = \"SELECT campaign.name FROM campaign LIMIT 10\"\n response = stream_response(client, customer_id, query=query)\n # Access the iterator in a different scope from where the service object was created.\n try:\n for batch in response:\n # Iterate through response, expect undefined behavior.\n\nIn the above code, the `GoogleAdsService` object is created within a different\nscope from where the iterator is accessed. As a result, the `Channel` object may\nbe destroyed before the iterator consumes the entire response.\n\nInstead, the streaming iterator should remain in the same scope as the\n`GoogleAdsService` client for as long as it is being used: \n\n def main(client, customer_id):\n ga_service = client.get_service(\"GoogleAdsService\", version=\"v21\")\n query = \"SELECT campaign.name FROM campaign LIMIT 10\"\n response = ga_service.search_stream(customer_id=customer_id, query=query)\n # Access the iterator in the same scope as where the service object was created.\n try:\n for batch in response:\n # Successfully iterate through response."]]