Die search_stream Methode gibt einen Iterator von
SearchGoogleAdsStreamResponse
Objekten zurück.
Sie können die einzelnen GoogleAdsRow
im Feld results jeder Antwort durchlaufen, wie in diesem Codebeispiel gezeigt.
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.' )
Die Struktur der einzelnen GoogleAdsRow-Objekte wird durch die Felder bestimmt, die Sie in Ihrer Google Ads Query Language-Abfrage (GAQL) auswählen. Weitere Informationen zur Antwortstruktur finden Sie unter
Google Ads Query Language.
Beim Aufruf von
GoogleAdsService.search_stream,
wird ein Streaming-Antwortiterator zurückgegeben. Dieser Iterator sollte sich während der Verwendung im selben Gültigkeitsbereich wie der GoogleAdsService-Client befinden, um fehlerhafte Streams oder Segmentierungsfehler zu vermeiden. Das liegt daran, dass das gRPC-Objekt Channel bereinigt wird, sobald das geöffnete GoogleAdsService-Objekt außerhalb des Gültigkeitsbereichs liegt.
Wenn sich das GoogleAdsService-Objekt nicht mehr im Gültigkeitsbereich befindet, wenn die Iteration für das Ergebnis von search_stream erfolgt, wurde das Objekt Channel möglicherweise bereits zerstört. Dies führt zu undefiniertem Verhalten, wenn der Iterator versucht, den nächsten Wert abzurufen.
Der folgende Code zeigt die falsche Verwendung von Streaming-Iteratoren:
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.
In diesem Code wird das GoogleAdsService-Objekt in einem anderen Gültigkeitsbereich erstellt als der, in dem auf den Iterator zugegriffen wird. Daher wird das Objekt Channel möglicherweise zerstört, bevor der Iterator die gesamte Antwort verarbeitet hat.
Stattdessen sollte sich der Streaming-Iterator so lange im selben Gültigkeitsbereich wie der GoogleAdsService-Client befinden, wie er verwendet wird:
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.