تایم اوت ها

کتابخانه سرویس گیرنده برای پایتون هیچ مهلت زمانی پیش‌فرضی را مشخص نمی‌کند، همچنین هیچ پیش‌فرضی در لایه انتقال gRPC مشخص نشده است. این بدان معناست که به طور پیش‌فرض، کتابخانه کلاینت برای پایتون رفتار زمان‌بندی را به طور کامل به سرور واگذار می‌کند.

این برای اکثر موارد استفاده کافی است. با این حال، اگر نیاز به تعیین یک بازه زمانی سمت سرویس گیرنده باشد، کتابخانه سرویس گیرنده برای پایتون از لغو مهلت زمانی برای هر دو جریان و تماس‌های unary پشتیبانی می‌کند.

می‌توانید زمان‌بندی را روی ۲ ساعت یا بیشتر تنظیم کنید، اما API ممکن است همچنان درخواست‌های طولانی‌مدت را به پایان برساند و خطای DEADLINE_EXCEEDED را برگرداند. اگر این مشکل ایجاد شد، می توانید پرس و جو را تقسیم کنید و تکه ها را به صورت موازی اجرا کنید. این از موقعیتی جلوگیری می کند که یک درخواست طولانی مدت با شکست مواجه شود و تنها راه برای بازیابی، راه اندازی مجدد درخواست است.

وقفه زمانی تماس جریانی

تنها روش سرویس Google Ads API که از این نوع تماس استفاده می کند GoogleAdsService.SearchStream است.

برای لغو مهلت زمانی پیش‌فرض، باید یک پارامتر اضافی هنگام فراخوانی متد اضافه کنید:

def make_server_streaming_call(client, customer_id):
    """Makes a server streaming call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The str Google Ads customer ID.
    """
    ga_service = client.get_service("GoogleAdsService")
    campaign_ids = []

    try:
        search_request = client.get_type("SearchGoogleAdsStreamRequest")
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        stream = ga_service.search_stream(
            request=search_request,
            # When making any request, an optional "timeout" parameter can be
            # provided to specify a client-side response deadline in seconds.
            # If not set, then no timeout will be enforced by the client and
            # the channel will remain open until the response is completed or
            # severed, either manually or by the server.
            timeout=_CLIENT_TIMEOUT_SECONDS,
        )

        for batch in stream:
            for row in batch.results:
                campaign_ids.append(row.campaign.id)

        print("The server streaming call completed before the timeout.")
    except DeadlineExceeded as ex:
        print("The server streaming call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")
      

مهلت زمانی تماس Unary

بیشتر روش‌های سرویس Google Ads API از تماس‌های unary استفاده می‌کنند. نمونه های معمولی عبارتند از GoogleAdsService.Search و GoogleAdsService.Mutate .

برای لغو مهلت زمانی پیش‌فرض، باید یک پارامتر اضافی هنگام فراخوانی متد اضافه کنید:

def make_unary_call(client, customer_id):
    """Makes a unary call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The Google Ads customer ID.
    """
    ga_service = client.get_service("GoogleAdsService")
    campaign_ids = []

    try:
        search_request = client.get_type("SearchGoogleAdsRequest")
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        results = ga_service.search(
            request=search_request,
            # When making any request, an optional "retry" parameter can be
            # provided to specify its retry behavior. Complete information about
            # these settings can be found here:
            # https://googleapis.dev/python/google-api-core/latest/retry.html
            retry=Retry(
                # Sets the maximum accumulative timeout of the call; it
                # includes all tries.
                deadline=_CLIENT_TIMEOUT_SECONDS,
                # Sets the timeout that is used for the first try to one tenth
                # of the maximum accumulative timeout of the call.
                # Note: This overrides the default value and can lead to
                # RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We
                # recommend changing the value only if necessary.
                initial=_CLIENT_TIMEOUT_SECONDS / 10,
                # Sets the maximum timeout that can be used for any given try
                # to one fifth of the maximum accumulative timeout of the call
                # (two times greater than the timeout that is needed for the
                # first try).
                maximum=_CLIENT_TIMEOUT_SECONDS / 5,
            ),
        )

        for row in results:
            campaign_ids.append(row.campaign.id)

        print("The unary call completed before the timeout.")
    except DeadlineExceeded as ex:
        print("The unary call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")