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.' )
আপনার Google Ads Query Language (GAQL) কোয়েরিতে নির্বাচিত ফিল্ডগুলোর মাধ্যমে প্রতিটি GoogleAdsRow এর কাঠামো নির্ধারিত হয়। রেসপন্স কাঠামো সম্পর্কে আরও বিস্তারিত জানতে, Google Ads Query Language দেখুন।
GoogleAdsService.search_stream কল করার সময়, একটি স্ট্রিমিং রেসপন্স ইটারেটর রিটার্ন করা হয়। ব্রোকেন স্ট্রিম বা সেগমেন্টেশন ফল্ট এড়ানোর জন্য, ব্যবহারের সময় এই ইটারেটরটিকে GoogleAdsService ক্লায়েন্টের একই স্কোপের মধ্যে রাখা উচিত। এর কারণ হলো, খোলা GoogleAdsService অবজেক্টটি স্কোপের বাইরে চলে গেলেই gRPC Channel অবজেক্টটি গার্বেজ-কালেক্টেড হয়ে যায়। যদি search_stream এর ফলাফলের উপর ইটারেশন চলার সময় GoogleAdsService অবজেক্টটি আর স্কোপের মধ্যে না থাকে, তাহলে Channel অবজেক্টটি ইতোমধ্যেই ডেস্ট্রয় হয়ে যেতে পারে, যার ফলে ইটারেটরটি যখন পরবর্তী ভ্যালুটি নেওয়ার চেষ্টা করে তখন অনির্ধারিত আচরণ (undefined behavior) ঘটে।
নিম্নলিখিত কোডটি স্ট্রিমিং ইটারেটরের ভুল ব্যবহার প্রদর্শন করে:
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.