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

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

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

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