Iterator Streaming

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 aliran yang rusak atau kesalahan segmentasi. Hal ini karena objek Channel gRPC akan dibersihkan sampah memori setelah objek GoogleAdsService yang terbuka keluar dari cakupan. Jika objek GoogleAdsService tidak lagi berada dalam cakupan pada saat iterasi terjadi pada hasil search_stream, objek Channel mungkin telah 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="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.

Dalam kode di atas, objek GoogleAdsService dibuat dalam cakupan yang berbeda dengan 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="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.