Akış İterasyonları

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.