_import3 no longer blocks event loop during decryption
Now running encrytion of accounts in ProcessPoolExecutor
This commit is contained in:
parent
f4a5f51b23
commit
157c2c4aa2
@ -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] = []
|
||||
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
|
||||
account = encryption.accounts.encrypt(account, text)
|
||||
result = db.add.add_account(engine, account)
|
||||
if not result:
|
||||
failed.append(account.name)
|
||||
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()
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user