Yanıt akışı yineleyicileri

search_stream yöntemi, SearchGoogleAdsStreamResponse nesnelerinin bir yineleyicisini döndürür.

Akış yanıtlarını yineleme

Aşağıdaki kod örneğinde gösterildiği gibi, her yanıttaki results alanında bulunan her GoogleAdsRow için yineleme yapabilirsiniz:

def main(client: GoogleAdsClient, customer_id: str) -> None:
    ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")

    query: str = """
        SELECT
          campaign.id,
          campaign.name
        FROM campaign
        ORDER BY campaign.id"""

    # Issues a search request using streaming.
    stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream(
        customer_id=customer_id, query=query
    )

    for batch in stream:
        rows: List[GoogleAdsRow] = batch.results
        for row in rows:
            print(
                f"Campaign with ID {row.campaign.id} and name "
                f'"{row.campaign.name}" was found.'
            )
      

Her bir GoogleAdsRow nesnesinin yapısı, Google Ads Sorgu Dili (GAQL) sorgunuzda seçtiğiniz alanlara göre belirlenir. Yanıt yapısı hakkında daha fazla bilgi için Google Ads Sorgu Dili'ne bakın.

Yineleyiciyi kapsamda tutma

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 temel gRPC Channel nesnesinin atık toplama işlemine tabi tutulmasıdır. search_stream sonucunda iterasyon gerçekleştiğinde GoogleAdsService nesnesi artık kapsamda değilse Channel nesnesi zaten yok edilmiş olabilir. Bu durumda, yineleyici bir sonraki değeri almaya çalıştığında tanımsız davranışa neden olur.

Aşağıdaki kodda akış yineleyicilerinin yanlış kullanımı gösterilmektedir:

def stream_response(client, customer_id, query):
    # The GoogleAdsService instance goes out of scope when this function
    # returns.
    ga_service = client.get_service(
        "GoogleAdsService", version="v26"
    )
    return ga_service.search_stream(customer_id=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)

    # Accessing the iterator in a different scope from where the service object
    # was created results in undefined behavior.
    for batch in response:
        print(batch)

Bu kodda, GoogleAdsService nesnesi, yineleyicinin erişildiği yerden farklı bir kapsamda oluşturulur. Sonuç olarak, yineleyici yanıtın tamamını tüketmeden önce Channel nesnesi yok edilebilir.

Bunun yerine, akış yineleyiciyi kullanıldığı sürece GoogleAdsService istemcisiyle aynı kapsamda tutun:

def main(client, customer_id):
    ga_service = client.get_service(
        "GoogleAdsService", version="v26"
    )
    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 where the service object was
    # created.
    for batch in response:
        print(batch)