mirror of
https://github.com/josegonzalez/python-github-backup.git
synced 2025-12-05 16:18:02 +01:00
Add basic API request throttling
A simple approach to throttle API requests and so keep within the rate limits of the API. Can be enabled with "--throttle-limit" to specify when throttling should start. "--throttle-pause" defines the time to sleep between further API requests.
This commit is contained in:
@@ -331,6 +331,16 @@ def parse_args():
|
||||
action='store_true',
|
||||
dest='include_assets',
|
||||
help='include assets alongside release information; only applies if including releases')
|
||||
parser.add_argument('--throttle-limit',
|
||||
dest='throttle_limit',
|
||||
type=int,
|
||||
default=0,
|
||||
help='start throttling of GitHub API requests after this amount of API requests remain')
|
||||
parser.add_argument('--throttle-pause',
|
||||
dest='throttle_pause',
|
||||
type=float,
|
||||
default=30.0,
|
||||
help='wait this amount of seconds when API request throttling is active (default: 30.0, requires --throttle-limit to be set)')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
@@ -439,6 +449,14 @@ def retrieve_data_gen(args, template, query_args=None, single_request=False):
|
||||
r, errors = _get_response(request, auth, template)
|
||||
|
||||
status_code = int(r.getcode())
|
||||
# be gentle with API request limit and throttle requests if remaining requests getting low
|
||||
limit_remaining = int(r.headers.get('x-ratelimit-remaining', 0))
|
||||
if limit_remaining <= args.throttle_limit:
|
||||
log_info(
|
||||
'API request limit hit: {} requests left, pausing further requests for {}s'.format(
|
||||
limit_remaining,
|
||||
args.throttle_pause))
|
||||
time.sleep(args.throttle_pause)
|
||||
|
||||
retries = 0
|
||||
while retries < 3 and status_code == 502:
|
||||
|
||||
Reference in New Issue
Block a user