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

בשיחה 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.