Il metodo search_stream restituisce un iteratore di
SearchGoogleAdsStreamResponse
oggetti.
Puoi scorrere ogni GoogleAdsRow
nel campo results di ogni risposta, come mostrato in questo esempio di codice.
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.
Quando chiami
GoogleAdsService.search_stream,
viene restituito un iteratore di risposte di 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 Channel gRPC 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 indefinito quando l'iteratore tenta di recuperare il valore successivo.
Il seguente codice mostra un utilizzo errato degli iteratori di streaming:
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 questo codice, l'oggetto GoogleAdsService viene creato in un ambito diverso da quello in cui si accede all'iteratore. Di conseguenza, l'oggetto Channel potrebbe essere eliminato prima che l'iteratore utilizzi l'intera risposta.
L'iteratore di streaming deve invece rimanere 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="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.