Бот Telegram - проблема с блокировкой синхронизации функций - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть телеграмм-бот, написанный на python, который позволяет пользователям создавать экземпляры EC2 в AWS.Код следующий:

# We create the new EC2 instance for the new user
instance_id, ec2 = generateInstanceForUser(user_id)

i = ec2.Instance(id=instance_id) # instance id
i.start()
i.wait_until_running()
i.load()
time.sleep(45)

# Create account in DB
createAccountDB(user_id, username, user.mail, instance_id)

# Now that the instance and the account have been created, now settings have to be updated too
updateSettings(user_id, dictChange)

Проблема в том, что функция generateInstanceForUser(user_id) блокирует рабочий процесс, а также следующие 5 строк (очевидно, с функцией time.sleep()).Последняя функция updateSettings() подключается через SSH к только что созданной машине и выполняет некоторые операции.Без учета задержек этот рабочий процесс работает хорошо.

ОДНАКО, поскольку я использую бота Telegram, во время этой части кода он зависает в течение 2 минут.В результате, если есть другие пользователи, отправляющие команды, бот не отвечает, и это нежелательно, очевидно.

ПРИМЕЧАНИЕ: используемые функции хранятся в библиотеке boto3.

ВОПРОС

Знаете ли вы какую-нибудь альтернативу, чтобы избежать блокирования рабочего процесса во время выполнения данного кода, чтобы избежать плохого UX с ботом Telegram?Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Я нашел себе ответ.Я просто инкапсулировал блокирующую часть кода внутри другой функции и использовал многопоточность для создания параллельного потока.Таким образом, основной поток не будет блокироваться, и бот будет продолжать работать в обычном режиме:

threads = []
t = threading.Thread(target=workerFunc, args=(apiKey, apiSecret, user_id, startStepValue, username, user, bot, update, leverageValue))
threads.append(t)
t.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...