ה-method search_stream מחזירה איטרטור של אובייקטים מסוג SearchGoogleAdsStreamResponse.
איטרציה על תשובות בסטרימינג
אפשר לעבור על כל GoogleAdsRow בשדה results של כל תשובה, כמו בדוגמת הקוד הבאה:
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 (GAQL). לפרטים נוספים על מבנה התגובה, אפשר לעיין במאמר שפת השאילתות של Google Ads.
השאירו את האיטרטור בהיקף
כשמפעילים את GoogleAdsService.search_stream, מוחזר איטרטור של תשובות בסטרימינג. כדי למנוע שגיאות פילוח או שיבושים בסטרימינג, האיטרטור הזה חייב להישאר באותו היקף כמו הלקוח GoogleAdsService בזמן השימוש. הסיבה לכך היא שאובייקט gRPC Channel הבסיסי נאסף על ידי מנגנון איסוף הזבל ברגע שהאובייקט הפתוח GoogleAdsService יוצא מההיקף. אם האובייקט GoogleAdsService כבר לא נמצא בהיקף כשמתרחשת איטרציה בתוצאה של search_stream, יכול להיות שהאובייקט Channel כבר נהרס, מה שגורם להתנהגות לא מוגדרת כשהאיטרטור מנסה לאחזר את הערך הבא.
הקוד הבא מדגים שימוש שגוי באיטרטורים של סטרימינג:
def stream_response(client, customer_id, query):
# The GoogleAdsService instance goes out of scope when this function
# returns.
ga_service = client.get_service(
"GoogleAdsService", version="v26"
)
return ga_service.search_stream(customer_id=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)
# Accessing the iterator in a different scope from where the service object
# was created results in undefined behavior.
for batch in response:
print(batch)
בקוד הזה, האובייקט GoogleAdsService נוצר בהיקף שונה מהמקום שבו מתבצעת הגישה לאיטרטור. כתוצאה מכך, יכול להיות שהאובייקט Channel יושמד לפני שהאיטרטור יצרוך את כל התגובה.
במקום זאת, צריך להשאיר את האיטרטור של הסטרימינג באותו היקף של הלקוח GoogleAdsService כל עוד משתמשים בו:
def main(client, customer_id):
ga_service = client.get_service(
"GoogleAdsService", version="v26"
)
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 where the service object was
# created.
for batch in response:
print(batch)