Iteradores de transmisión

Cuando se llama a GoogleAdsService.search_stream, se muestra un iterador de respuesta de transmisión. Para evitar transmisiones interrumpidas o fallas de segmentación, este iterador debe permanecer en el mismo alcance que el cliente GoogleAdsService mientras se usa. Esto se debe a que el objeto Channel de gRPC se recolecta como elemento no utilizado una vez que el objeto GoogleAdsService abierto queda fuera de alcance. Si el objeto GoogleAdsService ya no está dentro del alcance en el momento en que ocurre la iteración en el resultado de search_stream, es posible que el objeto Channel ya esté destruido, lo que causará un comportamiento indefinido cuando el iterador intenta recuperar el siguiente valor.

En el siguiente código, se muestra el uso incorrecto de iteradores de transmisión:

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.

En el código anterior, el objeto GoogleAdsService se crea dentro de un alcance diferente desde el que se accede al iterador. Como resultado, el objeto Channel se puede destruir antes de que el iterador consuma toda la respuesta.

En cambio, el iterador de transmisión debe permanecer en el mismo alcance que el cliente GoogleAdsService mientras se use:

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.