Itérateurs de flux
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Lorsque vous appelez GoogleAdsService.search_stream
, un itérateur de réponse de flux est renvoyé. Cet itérateur doit rester dans le même champ d'application que le client GoogleAdsService
lorsqu'il est utilisé afin d'éviter les flux interrompus ou les erreurs de segmentation. En effet, l'objet Channel
gRPC est collecté en tant qu'objet inutilisé une fois que l'objet GoogleAdsService
ouvert sort du champ d'application.
Si l'objet GoogleAdsService
n'est plus dans le champ d'application au moment où l'itération se produit sur le résultat de search_stream
, l'objet Channel
peut déjà être détruit, ce qui entraîne un comportement indéfini lorsque l'itérateur tente de récupérer la valeur suivante.
Le code suivant montre une utilisation incorrecte des itérateurs de flux :
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.
Dans le code ci-dessus, l'objet GoogleAdsService
est créé dans une portée différente de celle où l'itérateur est accessible. Par conséquent, l'objet Channel
peut être détruit avant que l'itérateur ne consomme l'intégralité de la réponse.
Au lieu de cela, l'itérateur de flux doit rester dans le même champ d'application que le client GoogleAdsService
tant qu'il est utilisé :
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.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/27 (UTC).
[null,null,["Dernière mise à jour le 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."]]