Streaming-Validatoren

Beim Aufrufen von GoogleAdsService.search_stream wird ein Iterator für die Streamingantwort zurückgegeben. Dieser Iterator sollte während seiner Verwendung im selben Bereich wie der GoogleAdsService-Client bleiben, um fehlerhafte Streams oder Segmentierungsfehler zu vermeiden. Das liegt daran, dass das gRPC-Channel-Objekt durch die automatische Speicherbereinigung gelöscht wird, sobald das offene GoogleAdsService-Objekt aus dem Bereich ausgeschlossen wird. Wenn das Objekt GoogleAdsService zum Zeitpunkt der Iteration für das Ergebnis von search_stream nicht mehr in den Geltungsbereich fällt, ist das Objekt Channel möglicherweise bereits gelöscht. Dies führt zu undefiniertem Verhalten, wenn der Iteration versucht, den nächsten Wert abzurufen.

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

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v16").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 Objekt GoogleAdsService in einem anderen Bereich erstellt als dem, in dem auf den Iterator zugegriffen wird. Daher kann das Objekt Channel gelöscht werden, bevor der Iteration die gesamte Antwort verbraucht.

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

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