Akış İterasyonları

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.