هنگام تماس با GoogleAdsService.search_stream
، یک تکرارکننده پاسخ جریانی برگردانده میشود. این تکرارکننده باید در حین استفاده از سرویس گیرنده GoogleAdsService
در محدوده مشابهی باقی بماند تا از جریانهای شکسته یا خطاهای تقسیمبندی جلوگیری شود. این به این دلیل است که وقتی شیء GoogleAdsService
باز از محدوده خارج شود، شیء Channel
gRPC به صورت زباله جمعآوری میشود. اگر شیء GoogleAdsService
تا زمانی که تکرار در نتیجه search_stream
اتفاق میافتد دیگر در محدوده نباشد، ممکن است شی Channel
قبلاً از بین رفته باشد و هنگامی که تکرارکننده تلاش میکند مقدار بعدی را بازیابی کند، رفتار نامشخصی ایجاد میکند.
کد زیر استفاده نادرست از تکرار کننده های جریان را نشان می دهد:
def stream_response(client, customer_id, query):
return client.get_service("GoogleAdsService", version="v18").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.
در کد بالا، شی GoogleAdsService
در محدوده متفاوتی از جایی که به تکرار کننده دسترسی دارد ایجاد می شود. در نتیجه، شی Channel
ممکن است قبل از اینکه تکرار کننده کل پاسخ را مصرف کند، از بین برود.
درعوض، تکرارکننده جریان باید تا زمانی که از آن استفاده میشود، در همان محدوده مشتری GoogleAdsService
باقی بماند:
def main(client, customer_id):
ga_service = client.get_service("GoogleAdsService", version="v18")
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.