GoogleAdsService.search_stream
çağrılırken bir akış yanıtı yinelemesi döndürülür. Bu yineleme, bozuk akışları veya segmentasyon hatalarını önlemek için kullanılırken GoogleAdsService
istemcisiyle aynı kapsamda kalmalıdır. Bunun nedeni, açık GoogleAdsService
nesnesi kapsam dışına çıktıktan sonra gRPC Channel
nesnesinin atık olarak toplanmasıdır.
search_stream
sonucunda iterasyon gerçekleşirken GoogleAdsService
nesnesi artık kapsam dışındaysa Channel
nesnesi zaten yok edilmiş olabilir. Bu da yineleyici bir sonraki değeri almaya çalıştığında tanımlanmamış davranışa neden olabilir.
Aşağıdaki kod, akış yineleyicilerinin yanlış kullanımını göstermektedir:
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.
Yukarıdaki kodda GoogleAdsService
nesnesi, yineleyiciye erişildiği yerden farklı bir kapsam dahilinde oluşturulmuştur. Bunun sonucunda Channel
nesnesi, yineleyici yanıtın tamamını tüketmeden kaldırılabilir.
Bunun yerine, akış yineleyicisi, kullanıldığı sürece GoogleAdsService
istemcisiyle aynı kapsamda kalmalıdır:
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.