Durante la chiamata
GoogleAdsService.search_stream
,
viene restituito un iteratore di risposte in modalità flusso. Questo iteratore deve rimanere nella
lo stesso ambito del client GoogleAdsService
mentre viene utilizzato per evitare
stream interrotti o errori di segmentazione. Questo perché l'oggetto gRPC Channel
viene garbage collection quando l'oggetto GoogleAdsService
aperto esce dall'ambito.
Se l'oggetto GoogleAdsService
non rientra più nell'ambito al momento dell'iterazione
si verifica in seguito al risultato di search_stream
, l'oggetto Channel
potrebbe essere già
distrutta, causando un comportamento indefinito quando l'iteratore tenta di recuperare
valore successivo.
Il seguente codice mostra l'utilizzo non corretto degli iteratori di flussi di dati:
def stream_response(client, customer_id, query):
return client.get_service("GoogleAdsService", version="v17").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.
Nel codice riportato sopra, l'oggetto GoogleAdsService
è creato all'interno di un'altra
l'ambito da cui si accede all'iteratore. Di conseguenza, l'oggetto Channel
potrebbe
prima che l'iteratore consumi l'intera risposta.
L'iteratore dei flussi di dati dovrebbe invece rimanere nello stesso ambito
GoogleAdsService
per tutto il tempo in cui viene utilizzato:
def main(client, customer_id):
ga_service = client.get_service("GoogleAdsService", version="v17")
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.