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