Itérateurs de flux

Lors d'un appel GoogleAdsService.search_stream, un itérateur de réponse en flux continu est renvoyé. Cet itérateur doit rester dans la le même champ d'application que le client GoogleAdsService tout en étant utilisé, afin d'éviter ou des erreurs de segmentation. En effet, l'objet gRPC Channel est récupérée une fois que l'objet GoogleAdsService ouvert sort du champ d'application. Si l'objet GoogleAdsService n'est plus inclus dans le champ d'application au moment où l'itération se produit sur le résultat de search_stream, l'objet Channel est peut-être déjà détruit, ce qui entraîne un comportement indéfini lorsque l'itérateur tente de récupérer valeur suivante.

Le code suivant illustre une utilisation incorrecte des itérateurs de flux continu:

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v22").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 autre d'application à partir duquel vous accédez à l'itérateur. Par conséquent, l'objet Channel peut avant que l'itérateur n'utilise l'intégralité de la réponse.

L'itérateur de flux doit rester dans le même champ d'application que GoogleAdsService tant qu'il est utilisé:

def main(client, customer_id):
    ga_service = client.get_service("GoogleAdsService", version="v22")
    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.