Я пытался использовать asyncio, чтобы ускорить этот цикл с помощью запросов api и создания словарей, но, похоже, он остается таким медленным, занимая более 2 секунд

#python #django #performance #python-asyncio

Вопрос:

… более 2 секунд всего на 4 запроса данных к функции обмена и создания словаря.

если у кого-то есть какие-либо предложения, это было бы большой помощью.

 async_tasks = []
        async def sigBuy(count):

            bot_dict = Bot.to_dict(activeBots[count])
            sigSettings_dict = Bot.to_dict(activeBots[count].sigSettings)

            # Binance API and Secret Keys
            Bclient = Client(sigSettings_dict['API_key'], sigSettings_dict['API_secret_key'])
            
            p = round(float(percentage(7, bot_dict['ct_balance']) / (float(bin_asset_price['price']) / 1)), 8)
            # Round and Asign the asset_amount
            asset_amount = round(p, 2)

            # shouldILog = await makeBuy(market, asset_amount, Bclient, sigSettings_dict['base_currency'])
            shouldILog = 2
            if shouldILog == 2:
                asset_amount = int(asset_amount)

            last_trade = Bclient.get_all_orders(symbol=market   sigSettings_dict['base_currency'])[-1]
            print(last_trade)

            asset_price = float(last_trade['cummulativeQuoteQty']) / float(last_trade['executedQty'])
            buyInPrice = float(last_trade['cummulativeQuoteQty'])

            for otrade in activeBots[count].opentrades.all():
                trade = Bot.to_dict(otrade)
                del trade['id']
                otradesUpdate.append(trade)
            
            openTrades_dict = {'bot_ID': bot_dict['id'], 'date': date, 'market': market, 'trade_mode': 'Buy', 'price': asset_price, 'amount': asset_amount, 'amount_in_base_currency': buyInPrice, 'result': 0}

            otradesUpdate.append(openTrades_dict)
            BotsUpdate.append(bot_dict)
            SigSettingsUpdate.append(sigSettings_dict)

        for count, bot in enumerate(activeBots):
            async_tasks.append(loop.create_task(sigBuy(count)))

        loop.run_until_complete(asyncio.gather(*async_tasks))
 

В activeBots всего 4 бота

Комментарии:

1. asyncio не ускорит ваш код сам по себе. Вам нужно использовать код с поддержкой asyncio и библиотеки, которые вернут управление циклу событий во время ожидания ввода sigBuy -вывода.Ничего не ожидает, и поэтому каждый вызов будет блокироваться до его завершения.