Iteradores de streaming
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Ao chamar
GoogleAdsService.search_stream
,
um iterador de resposta de streaming é retornado. Esse iterador precisa permanecer no mesmo escopo do cliente GoogleAdsService
durante o uso para evitar fluxos interrompidos ou falhas de segmentação. Isso ocorre porque o objeto gRPC Channel
é coletado como lixo quando o objeto GoogleAdsService
aberto sai do escopo.
Se o objeto GoogleAdsService
não estiver mais no escopo quando a iteração
ocorrer no resultado de search_stream
, o objeto Channel
poderá já ter sido
destruído, causando um comportamento indefinido quando o iterador tentar recuperar o
próximo valor.
O código a seguir demonstra o uso incorreto de iteradores de streaming:
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.
No código acima, o objeto GoogleAdsService
é criado em um escopo diferente de onde o iterador é acessado. Como resultado, o objeto Channel
pode ser destruído antes que o iterador consuma toda a resposta.
Em vez disso, o iterador de streaming precisa permanecer no mesmo escopo do cliente GoogleAdsService
enquanto estiver sendo usado:
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.
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-08-27 UTC.
[null,null,["Última atualização 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."]]