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
di-garbage collection 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="v19").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 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="v19")
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.