Iteratori di streaming

Quando chiami GoogleAdsService.search_stream, viene restituito un iteratore di risposte dinamiche. Questo iteratore deve rimanere nello stesso ambito del client GoogleAdsService durante l'utilizzo per evitare stream non validi o errori di segmentazione. Questo accade perché l'oggetto gRPC Channel viene sottoposto a garbage collection quando l'oggetto GoogleAdsService aperto esce dall'ambito. Se l'oggetto GoogleAdsService non è più nell'ambito al momento dell'iterazione sul risultato di search_stream, l'oggetto Channel potrebbe essere già stato distrutto, causando un comportamento non definito quando l'iteratore tenta di recuperare il valore successivo.

Il codice seguente mostra un utilizzo errato degli iteratori di streaming:

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v19").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.

Nel codice riportato sopra, l'oggetto GoogleAdsService viene creato in un ambito diverso da quello in cui viene eseguito l'accesso all'iteratore. Di conseguenza, l'oggetto Channel potrebbe essere distrutto prima che l'iteratore consumi l'intera risposta.

L'iteratore di streaming deve invece rimanere nello stesso ambito del client GoogleAdsService per tutto il tempo in cui viene utilizzato:

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