स्ट्रीमिंग इटरेटर

GoogleAdsService.search_stream को कॉल करने पर, स्ट्रीमिंग रिस्पॉन्स इटरेटर मिलता है. यह इटरेटर , इस्तेमाल किए जाते समय GoogleAdsService क्लाइंट के स्कोप में ही होना चाहिए, ताकि स्ट्रीम में रुकावट या सेगमेंटेशन की गड़बड़ियों से बचा जा सके. ऐसा इसलिए होता है, क्योंकि खुले हुए GoogleAdsService ऑब्जेक्ट के दायरे से बाहर हो जाने पर, gRPC Channel ऑब्जेक्ट ट्रैश से इकट्ठा होता है. अगर search_stream के नतीजे पर इटरेशन होने तक GoogleAdsService ऑब्जेक्ट स्कोप में नहीं है, तो हो सकता है कि 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.