search_stream वाला तरीका,
SearchGoogleAdsStreamResponse
ऑब्जेक्ट का इटरेटर दिखाता है.
इस कोड के उदाहरण में दिखाए गए तरीके से, हर जवाब के results फ़ील्ड में मौजूद हर GoogleAdsRow
को दोहराया जा सकता है.
def main(client: GoogleAdsClient, customer_id: str) -> None: ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") query: str = """ SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id""" # Issues a search request using streaming. stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream( customer_id=customer_id, query=query ) for batch in stream: rows: List[GoogleAdsRow] = batch.results for row in rows: print( f"Campaign with ID {row.campaign.id} and name " f'"{row.campaign.name}" was found.' )
हर GoogleAdsRow का स्ट्रक्चर, Google Ads Query Language (GAQL) क्वेरी में चुने गए फ़ील्ड के हिसाब से तय होता है. जवाब के स्ट्रक्चर के बारे में ज़्यादा जानकारी के लिए, Google Ads Query Language देखें.
`GoogleAdsService.search_stream` को कॉल करने पर, स्ट्रीमिंग रिस्पॉन्स इटरेटर दिखता है.GoogleAdsService.search_stream स्ट्रीम के खराब होने या सेगमेंटेशन फ़ॉल्ट से बचने के लिए, इस इटरेटर को GoogleAdsService क्लाइंट के दायरे में ही रखना चाहिए. ऐसा इसलिए होता है, क्योंकि gRPC Channel ऑब्जेक्ट, कचरा इकट्ठा करने की प्रोसेस के तहत तब तक इकट्ठा नहीं किया जाता, जब तक कि खुला हुआ GoogleAdsService ऑब्जेक्ट दायरे से बाहर न हो जाए.
अगर search_stream के नतीजे पर दोहराव की प्रोसेस पूरी होने तक, GoogleAdsService ऑब्जेक्ट दायरे में नहीं रहता है, तो हो सकता है कि Channel ऑब्जेक्ट पहले ही डिस्ट्रॉय हो गया हो. इससे इटरेटर, अगली वैल्यू को वापस पाने की कोशिश करता है, तो अनडिफ़ाइंड बिहेवियर हो सकता है.
यहां दिए गए कोड में, स्ट्रीमिंग इटरेटर के गलत इस्तेमाल के बारे में बताया गया है:
def stream_response(client, customer_id, query):
return client.get_service("GoogleAdsService", version="v24").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="v24")
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.