Привет, помогите пожалуйста сделать Rate Limit для запроса. Я делаю для себя маленький проект с api крипто-биржи Bybit и я хочу отправлять запрос о получении данных о определенной монете, но api делает ограничение в 5 req/s я использую асинхронные запросы и как я уже не пробовал сделать эту задержку у меня не получается. Пытался сделать задержку при составлении задач или перед отправкой запроса. Ничего не помогает, как появлялась ошибка о превышении rate limit, так и появляется. Вот скрипт: from settings import api_key, api_secret, base_url import aiohttp import asyncio import json import time import hmac import hashlib def generate_signature(query_string, timestamp): sign = str(timestamp) + str(api_key) + str(400000) + str(query_string) signature = hmac.new(api_secret.encode(), sign.encode(), hashlib.sha256).hexdigest() return signature async def get_timestamp(session): async with session.get(base_url + '/v5/market/time') as response: data = await response.json() timestamp = str(int(data['result']['timeSecond']) * 1000) return timestamp async def get_symbols(session): symbols = [] async with session.get(base_url + '/v5/market/tickers?category=spot') as response: data = await response.json() for i in data['result']['list']: symbol = i.get('symbol') if 'USDT' in symbol: symbols.append(symbol) return symbols async def coin_info(session, symbol, semaphore): timestamp = await get_timestamp(session) symbol_w = symbol.replace('USDT', '') query_string = f'coin={symbol_w}' signature = generate_signature(query_string, timestamp) headers = { 'X-BAPI-API-KEY': api_key, 'X-BAPI-RECV-WINDOW': '400000', 'X-BAPI-SIGN': signature, 'X-BAPI-TIMESTAMP': timestamp } async with semaphore: async with session.get(base_url + f'/v5/asset/coin/query-info?coin={symbol_w}', headers=headers) as response: if response.status == 200: data_coin_info = await response.json() if data_coin_info['retCode'] != 0: print(data_coin_info) else: print('все хорошо') return data_coin_info async def main(): coin_info_rate_limit = 5 semaphore = asyncio.Semaphore(coin_info_rate_limit) async with aiohttp.ClientSession() as session: symbols = await get_symbols(session) tasks = [] lenn = len(symbols) i = 0 for symbol in symbols: i +=1 print(f'{i}/{lenn}') tasks.append(coin_info(session, symbol, semaphore)) data_coin_info = await asyncio.gather(*tasks) print(data_coin_info) if __name__ == "__main__": asyncio.run(main()) Python from settings import api_key, api_secret, base_url import aiohttp import asyncio import json import time import hmac import hashlib def generate_signature(query_string, timestamp): sign = str(timestamp) + str(api_key) + str(400000) + str(query_string) signature = hmac.new(api_secret.encode(), sign.encode(), hashlib.sha256).hexdigest() return signature async def get_timestamp(session): async with session.get(base_url + '/v5/market/time') as response: data = await response.json() timestamp = str(int(data['result']['timeSecond']) * 1000) return timestamp async def get_symbols(session): symbols = [] async with session.get(base_url + '/v5/market/tickers?category=spot') as response: data = await response.json() for i in data['result']['list']: symbol = i.get('symbol') if 'USDT' in symbol: symbols.append(symbol) return symbols async def coin_info(session, symbol, semaphore): timestamp = await get_timestamp(session) symbol_w = symbol.replace('USDT', '') query_string = f'coin={symbol_w}' signature = generate_signature(query_string, timestamp) headers = { 'X-BAPI-API-KEY': api_key, 'X-BAPI-RECV-WINDOW': '400000', 'X-BAPI-SIGN': signature, 'X-BAPI-TIMESTAMP': timestamp } async with semaphore: async with session.get(base_url + f'/v5/asset/coin/query-info?coin={symbol_w}', headers=headers) as response: if response.status == 200: data_coin_info = await response.json() if data_coin_info['retCode'] != 0: print(data_coin_info) else: print('все хорошо') return data_coin_info async def main(): coin_info_rate_limit = 5 semaphore = asyncio.Semaphore(coin_info_rate_limit) async with aiohttp.ClientSession() as session: symbols = await get_symbols(session) tasks = [] lenn = len(symbols) i = 0 for symbol in symbols: i +=1 print(f'{i}/{lenn}') tasks.append(coin_info(session, symbol, semaphore)) data_coin_info = await asyncio.gather(*tasks) print(data_coin_info) if __name__ == "__main__": asyncio.run(main()) Помогите пожалуйста, если нужна документация к api, то вот - https://bybit-exchange.github.io/docs/v5/rate-limit
Всё, если что, я решил это) Можно было отправить всего 1 запрос на получения инфы о монетах, а не по каждому проходится и отправлять.
cdcauxklan, я указывал задержку в самой функции coin_info и при создании задач*. Просто код отправил без этого
asyncio.Semaphore лишь кол-во одновременных выполнений функции ограничивает, про затраченное время тут ни коим образом речи не идет. Свой хендлер для этого напиши, который будет считать запросы и время между ними и при необходимости уходить в сон, благо на питоне это просто Если совсем впадлу, то можешь время считать время входа в async with semaphore и время завершения, и потом в нем же вызывать асинхронный сон на 1 - разницу во времени. Ленивый метод, но рабочий. В идеале уводить запросы в сон на старте выполнения, а не в конце
argoars, Значит ты насрал в коде, ибо должно было помочь. Судя по инфе которую они оставили, там за промежуток чекается кол-во запросов, можешь хидеры выводить и дебажить где ты проебался