איטרטורים לסטרימינג

כשמפעילים את הפונקציה 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.