Lorsque vous appelez GoogleAdsService.search_stream
, un itérateur de réponse en streaming 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é par le garbage collector 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 de l'itération 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 illustre une utilisation incorrecte des itérateurs de flux:
def stream_response(client, customer_id, query):
return client.get_service("GoogleAdsService", version="v18").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 un champ d'application différent de celui où l'accès à l'itérateur est effectué. Par conséquent, l'objet Channel
peut être détruit avant que l'itérateur ne consomme l'intégralité de la réponse.
À la place, l'itérateur de streaming 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="v18")
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.