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

כשמפעילים את GoogleAdsService.search_stream, מוחזר איטרטור של תשובה שמוצגת באופן שוטף. האיטרטור הזה צריך להישאר באותו היקף כמו הלקוח GoogleAdsService בזמן השימוש בו, כדי למנוע זרמים שבורים או שגיאות פילוח. הסיבה לכך היא שהאובייקט gRPC Channel הוא נאסף אשפה ברגע שהאובייקט הפתוח GoogleAdsService יוצא מהתחום. אם האובייקט GoogleAdsService כבר לא נמצא בהיקף כשהאיטרציה מתרחשת על התוצאה של search_stream, יכול להיות שהאובייקט Channel כבר נהרס, ולכן ההתנהגות לא מוגדרת כשהאיטרטור מנסה לאחזר את הערך הבא.

בדוגמה הבאה מוצג שימוש לא נכון באיטרטורים של סטרימינג:

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v21").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="v21")
    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.