تکرار کننده های جریانی

هنگام تماس با GoogleAdsService.search_stream ، یک تکرارکننده پاسخ جریانی برگردانده می‌شود. این تکرارکننده باید در حین استفاده از سرویس گیرنده GoogleAdsService در محدوده مشابهی باقی بماند تا از جریان‌های شکسته یا خطاهای تقسیم‌بندی جلوگیری شود. این به این دلیل است که وقتی شیء GoogleAdsService باز از محدوده خارج شود، شیء Channel gRPC به صورت زباله جمع‌آوری می‌شود. اگر شیء GoogleAdsService تا زمانی که تکرار در نتیجه search_stream اتفاق می‌افتد دیگر در محدوده نباشد، ممکن است شی Channel قبلاً از بین رفته باشد و هنگامی که تکرارکننده تلاش می‌کند مقدار بعدی را بازیابی کند، رفتار نامشخصی ایجاد می‌کند.

کد زیر استفاده نادرست از تکرار کننده های جریان را نشان می دهد:

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v16").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="v16")
    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.