Trình lặp lại luồng phản hồi

Phương thức search_stream trả về một trình lặp của các đối tượng SearchGoogleAdsStreamResponse.

Lặp lại các câu trả lời được truyền trực tuyến

Bạn có thể lặp lại từng GoogleAdsRow trong trường results của từng phản hồi như minh hoạ trong ví dụ về mã sau:

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

Cấu trúc của mỗi GoogleAdsRow được xác định bằng các trường mà bạn chọn trong truy vấn Ngôn ngữ truy vấn Google Ads (GAQL). Để biết thêm thông tin chi tiết về cấu trúc phản hồi, hãy xem bài viết Ngôn ngữ truy vấn Google Ads.

Giữ trình lặp trong phạm vi

Khi gọi GoogleAdsService.search_stream, một trình lặp phản hồi truyền trực tuyến sẽ được trả về. Trình lặp này phải nằm trong cùng một phạm vi với ứng dụng GoogleAdsService trong khi được sử dụng để tránh các luồng bị hỏng hoặc lỗi phân đoạn. Điều này là do đối tượng gRPC Channel cơ bản được thu gom rác sau khi đối tượng GoogleAdsService đang mở nằm ngoài phạm vi. Nếu đối tượng GoogleAdsService không còn trong phạm vi khi quá trình lặp lại xảy ra trên kết quả của search_stream, thì đối tượng Channel có thể đã bị huỷ, gây ra hành vi không xác định khi trình lặp cố gắng truy xuất giá trị tiếp theo.

Đoạn mã sau đây minh hoạ cách sử dụng không chính xác của trình lặp luồng:

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)

Trong mã này, đối tượng GoogleAdsService được tạo trong một phạm vi khác với phạm vi truy cập của trình lặp. Do đó, đối tượng Channel có thể bị huỷ trước khi trình lặp sử dụng toàn bộ phản hồi.

Thay vào đó, hãy giữ trình lặp truyền trực tuyến trong cùng phạm vi với ứng dụng GoogleAdsService trong suốt thời gian sử dụng:

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)