تکرارکننده‌های جاری‌سازی پاسخ

روش search_stream تکرارکننده‌ای از اشیاء SearchGoogleAdsStreamResponse را برمی‌گرداند.

تکرار کردن پاسخ‌های جاری‌سازی

می‌توانید هر GoogleAdsRow را در فیلد results هر پاسخ تکرار کنید، همان‌طور که در نمونه کد زیر نشان داده شده است:

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.'
            )
      

ساختار هر GoogleAdsRow براساس فیلدهایی که در پُرسمان «زبان پُرسمان Google Ads» (GAQL) انتخاب می‌کنید تعیین می‌شود. برای جزئیات بیشتر درباره ساختار پاسخ، زبان پُرسمان Google Ads را ببینید.

نگه داشتن تکرارگر در محدوده

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

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

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)

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

درعوض، تکرارگر جاری‌سازی را تا زمانی که استفاده می‌شود در همان محدوده کارخواه GoogleAdsService نگه دارید:

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)