בשיחה
GoogleAdsService.search_stream
מוחזר איטרטור של תגובה בסטרימינג. האיטרטור הזה צריך להישאר
אותו היקף כמו הלקוח GoogleAdsService
בזמן שנעשה בו שימוש, כדי להימנע
שידורים לא תקינים או שגיאות פילוח. הסיבה לכך היא שהאובייקט Channel
ב-gRPC
איסוף האשפה נאסף כשהאובייקט GoogleAdsService
הפתוח יוצא מההיקף.
אם האובייקט GoogleAdsService
כבר לא נכלל בהיקף האיטרציה
שמתרחשת בתוצאה של search_stream
, ייתכן שהאובייקט Channel
כבר
נהרוס, וכך נעשות התנהגות לא מוגדרת כאשר האיטרטור מנסה לאחזר את
בערך הבא.
הקוד הבא מדגים שימוש שגוי באיטרטורים של סטרימינג:
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.
בקוד שלמעלה, האובייקט GoogleAdsService
נוצר בתוך
היקף מהמקום שבו מתבצעת הגישה לאיטרטור. כתוצאה מכך, האובייקט Channel
עשוי
יושמד לפני שהאיטרטור צורך את התגובה כולה.
במקום זאת, האיטרטור של הסטרימינג צריך להישאר באותו היקף כמו
לקוח GoogleAdsService
כל עוד משתמשים בו:
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.