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

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

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

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