Cuando llamas a GoogleAdsService.search_stream
, se muestra un iterador de respuesta de transmisión. Este iterador debe permanecer en el mismo alcance que el cliente GoogleAdsService
mientras se usa para evitar transmisiones interrumpidas o fallas de segmentación. Esto se debe a que el objeto Channel
de gRPC se recoge una vez que el objeto GoogleAdsService
abierto sale del alcance.
Si el objeto GoogleAdsService
ya no está dentro del alcance cuando se produce la iteración
en el resultado de search_stream
, es posible que el objeto Channel
ya esté
destruido, lo que causa un comportamiento no definido cuando el iterador intenta recuperar el
próximo valor.
En el siguiente código, se muestra un uso incorrecto de los iteradores de transmisión:
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.
En el código anterior, el objeto GoogleAdsService
se crea dentro de un alcance diferente al desde el que se accede al iterador. Como resultado, el objeto Channel
puede destruirse antes de que el iterador consuma toda la respuesta.
En su lugar, 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="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.