Il metodo search_stream restituisce un iteratore di oggetti SearchGoogleAdsStreamResponse.
Esegui l'iterazione delle risposte in streaming
Puoi eseguire l'iterazione di ogni GoogleAdsRow nel campo results di ogni risposta, come mostrato nell'esempio di codice seguente:
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.' )
La struttura di ogni GoogleAdsRow è determinata dai campi selezionati nella query Google Ads Query Language (GAQL). Per maggiori dettagli sulla struttura della risposta, consulta Google Ads Query Language.
Mantieni l'iteratore nell'ambito
Quando chiami
GoogleAdsService.search_stream,
viene restituito un iteratore di risposta in streaming. Questo iteratore deve rimanere nello stesso ambito del client GoogleAdsService durante l'utilizzo per evitare flussi interrotti o errori di segmentazione. Questo perché l'oggetto gRPC Channel sottostante viene sottoposto a garbage collection una volta che l'oggetto GoogleAdsService aperto esce dall'ambito. Se l'oggetto GoogleAdsService non è più nell'ambito quando si verifica l'iterazione sul risultato di search_stream, l'oggetto Channel potrebbe essere già stato eliminato, causando un comportamento non definito quando l'iteratore tenta di recuperare il valore successivo.
Il codice seguente mostra un utilizzo non corretto degli iteratori di stream:
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)
In questo codice, l'oggetto GoogleAdsService viene creato in un ambito diverso da quello in cui viene eseguito l'accesso all'iteratore. Di conseguenza, l'oggetto Channel potrebbe essere
eliminato prima che l'iteratore utilizzi l'intera risposta.
Mantieni invece l'iteratore di flussi nello stesso ambito del client GoogleAdsService per tutto il tempo in cui viene utilizzato:
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)