GoogleAdsService.search_stream
çağrıldığında bir akış yanıtı iteratörü döndürülür. Bu iteratör, bozuk akışlar veya segmentasyon hataları yaşanmaması için kullanılırken GoogleAdsService
istemciyle aynı kapsamda kalmalıdır. Bunun nedeni, açık GoogleAdsService
nesnesi kapsam dışında kaldığında gRPC Channel
nesnesinin çöp toplanmasıdır.
search_stream
sonucu üzerinde iterasyon yapıldığında GoogleAdsService
nesnesi artık kapsamda değilse Channel
nesnesi zaten yok edilmiş olabilir. Bu da iteratör bir sonraki değeri almaya çalışırken tanımlanmamış davranışa neden olur.
Aşağıdaki kodda, akış iteratörlerinin yanlış kullanımı gösterilmektedir:
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.
Yukarıdaki kodda GoogleAdsService
nesnesi, iteratöre erişilen yerden farklı bir kapsamda oluşturulur. Sonuç olarak, iteratör yanıtın tamamını tüketmeden önce Channel
nesnesi yok edilebilir.
Bunun yerine, akış iteratörü, kullanıldığı sürece GoogleAdsService
istemciyle aynı kapsamda kalmalıdır:
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.