مكرّرات عرض الرد تدريجيًا

يعرض الإجراء 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"‏ (GAQL). لمزيد من التفاصيل حول بنية الاستجابة، يُرجى الاطّلاع على لغة طلب البحث في "إعلانات Google".

إبقاء المكرّر في النطاق

عند استدعاء GoogleAdsService.search_stream، يتم عرض مكرِّر ردّ البث. يجب أن يظل هذا المكرّر في النطاق نفسه الذي يتواجد فيه عميل GoogleAdsService أثناء استخدامه لتجنّب حدوث أخطاء في البث أو أخطاء في التقسيم. ويرجع ذلك إلى أنّ كائن gRPC Channel الأساسي يتم تجميعه في المهملات بعد خروج كائن GoogleAdsService المفتوح من النطاق. إذا لم يعُد العنصر 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)