Akış İterasyonları

Arama yaparken GoogleAdsService.search_stream, akış yanıtı yineleyicisi döndürülür. Bu yineleyici, 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ığında gRPC Channel nesnesinin çöp toplama işlemine tabi tutulmasıdır. GoogleAdsService nesnesi, search_stream sonucunda yineleme gerçekleştiğinde artık kapsamda değilse Channel nesnesi zaten yok edilmiş olabilir. Bu durumda, yineleyici bir sonraki değeri almaya çalıştığında tanımlanmamış davranışa neden olur.

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="v21").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, yineleyicinin erişildiği kapsamdan farklı bir kapsamda oluşturulur. Sonuç olarak, yineleyici yanıtın tamamını kullanmadan önce Channel nesnesi yok edilebilir.

Bunun yerine, akış yineleyici, kullanıldığı sürece GoogleAdsService istemcisiyle aynı kapsamda kalmalıdır:

def main(client, customer_id):
    ga_service = client.get_service("GoogleAdsService", version="v21")
    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.