googleads / googleads-python-lib

The Python client library for Google's Ads APIs
Apache License 2.0
682 stars 975 forks source link

Improve Ad Manager's WaitForReport polling mechanism #465

Open svadali1 opened 4 years ago

svadali1 commented 4 years ago

Right now AdManager's WaitForReport waits for 30 seconds (via time.sleep(30)) if the report status is not COMPLETED or FAILED before checking the report status again.

Would it be reasonable to implement an exponential backoff strategy instead where we poll for the status of the report with an exponentially increasing delay? Something like the below seems to work:

wait_time_in_seconds = 1
exponential_backoff_multiplier = 2
...

while status != 'COMPLETED' and status != 'FAILED':
     _data_downloader_logger.debug('Report job status: %s', status)

        time.sleep(wait_time_in_seconds)

        if report_downloader._version > 'v201502':
            status = service.getReportJobStatus(report_job_id)
        else:
            status = service.getReportJob(report_job_id)['reportJobStatus']

        # Wait longer if we have to poll the report status again.
        wait_time_in_seconds *= exponential_backoff_multiplier

I will be happy to submit a PR if it makes sense to do the above change.