Streaming-Validatoren

Beim Anrufen GoogleAdsService.search_stream, wird ein Streamingantwort-Iterator zurückgegeben. Dieser Iterator sollte im denselben Umfang wie der GoogleAdsService-Client, während er verwendet wird, um oder Segmentierungsfehler. Das liegt daran, dass das gRPC-Channel-Objekt wird automatisch bereinigt, wenn das offene GoogleAdsService-Objekt den Bereich verlässt. Wenn das GoogleAdsService-Objekt zum Zeitpunkt der Iteration nicht mehr vorhanden ist beim Ergebnis von search_stream auftritt, ist das Channel-Objekt möglicherweise bereits was zu einem undefinierten Verhalten führt, wenn der Iterator versucht, für den nächsten Wert.

Der folgende Code zeigt eine falsche Verwendung von Streaming-Iteratoren:

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.

Im Code oben wird das GoogleAdsService-Objekt innerhalb eines anderen von dem aus auf den Iterator zugegriffen wird. Daher kann das Channel-Objekt bevor der Iterator die gesamte Antwort verarbeitet.

Stattdessen sollte der Streaming-Iterator im selben Bereich bleiben wie der GoogleAdsService-Client, solange er verwendet wird:

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.