Iterator Streaming

Saat menelepon GoogleAdsService.search_stream, iterator respons streaming ditampilkan. Iterator ini harus tetap berada cakupan yang sama dengan klien GoogleAdsService selagi digunakan untuk menghindari streaming yang bermasalah atau kesalahan segmentasi. Hal ini karena objek Channel gRPC dibersihkan sampah memorinya setelah objek GoogleAdsService terbuka berada di luar cakupan. Jika objek GoogleAdsService tidak lagi berada 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="v17").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 lingkungan lingkup dari mana iterator diakses. Akibatnya, objek Channel mungkin dihancurkan sebelum iterator menggunakan seluruh respons.

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

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