diff --git a/src/bot/message_handlers.py b/src/bot/message_handlers.py index 4212dd6..8c78657 100644 --- a/src/bot/message_handlers.py +++ b/src/bot/message_handlers.py @@ -1,6 +1,7 @@ import asyncio import functools import gc +import itertools from concurrent.futures import ProcessPoolExecutor import telebot @@ -639,14 +640,26 @@ async def _import3( # List of names of accounts, which failed to be added to the database # or failed the tests failed: list[str] = [] - for account in accounts: - if not check_account(account): - failed.append(account.name) - continue - account = encryption.accounts.encrypt(account, text) - result = db.add.add_account(engine, account) - if not result: - failed.append(account.name) + tasks: list[asyncio.Future[db.models.Account]] = [] + loop = asyncio.get_running_loop() + with ProcessPoolExecutor() as pool: + for account in accounts: + if not check_account(account): + failed.append(account.name) + continue + function = functools.partial( + encryption.accounts.encrypt, + account, + text, + ) + tasks.append(loop.run_in_executor(pool, function)) + enc_accounts: list[db.models.Account] = await asyncio.gather(*tasks) + results = db.add.add_accounts(engine, enc_accounts) + + failed_accounts = itertools.compress( + enc_accounts, (not result for result in results) + ) + failed.extend((account.name for account in failed_accounts)) if failed: await send_deleteable_message( @@ -655,7 +668,7 @@ async def _import3( else: await send_tmp_message(bot, mes.chat.id, "Успех") - del text, mes, accounts + del text, mes, accounts, function, tasks, failed_accounts gc.collect()