Iterator Streaming

Metode search_stream menampilkan iterator objek SearchGoogleAdsStreamResponse.

Anda dapat melakukan iterasi melalui setiap GoogleAdsRow di kolom results setiap respons seperti yang ditunjukkan dalam contoh kode ini.

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.'
            )
      

Struktur setiap GoogleAdsRow ditentukan oleh kolom yang Anda pilih dalam kueri Bahasa Kueri Google Ads (GAQL). Untuk mengetahui detail selengkapnya tentang struktur respons, lihat Bahasa Kueri Google Ads.

Saat memanggil GoogleAdsService.search_stream, iterator respons streaming akan ditampilkan. Iterator ini harus tetap berada dalam cakupan yang sama dengan klien GoogleAdsService saat digunakan untuk menghindari streaming yang rusak atau kesalahan segmentasi. Hal ini karena objek Channel gRPC akan dikumpulkan sampah setelah objek GoogleAdsService terbuka keluar dari cakupan. Jika objek GoogleAdsService tidak lagi dalam cakupan pada saat iterasi terjadi pada hasil search_stream, objek Channel mungkin sudah dihancurkan, sehingga menyebabkan perilaku yang tidak ditentukan saat iterator mencoba mengambil nilai berikutnya.

Kode berikut menunjukkan penggunaan iterator streaming yang salah:

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v24").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.

Dalam kode ini, objek GoogleAdsService dibuat dalam cakupan yang berbeda dari tempat iterator diakses. Akibatnya, objek Channel dapat dihancurkan sebelum iterator menggunakan seluruh respons.

Sebagai gantinya, iterator streaming harus tetap berada dalam cakupan yang sama dengan klien GoogleAdsService selama digunakan:

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