برامج تكرار البث

عند استدعاء GoogleAdsService.search_stream، يتم عرض أداة تكرار للردّ الذي يتم عرضه تدريجيًا. يجب أن يظلّ هذا الموسّع في النطاق نفسه الذي يستخدمه GoogleAdsService أثناء استخدامه لتجنُّب تعطُّل أحداث البث أو أخطاء التقسيم. ويعود السبب في ذلك إلى أنّه تتم إزالة محتوى Channel في gRPC بعد انتهاء صلاحية GoogleAdsService المفتوح. إذا لم يعُد عنصر GoogleAdsService ضمن النطاق في وقت تكرار القيمة الناتجة عن search_stream، قد يكون عنصر Channel قد تم تدميره، ما يؤدي إلى سلوك غير محدّد عندما يحاول المكرّر استرداد القيمة التالية.

يوضّح الرمز البرمجي التالي الاستخدام غير الصحيح لمُكرّرات البث:

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