Новый поток блокирует выполнение основного процесса

Рейтинг: 0Ответов: 1Опубликовано: 14.06.2023

У меня есть телеграмм бот, написанный на aiogram. Сам бот запускается в отдельном процессе:

def start_bot():
    executor.start_polling(dp, skip_updates=True)


if __name__ == '__main__':
    Process(target=start_bot).start()

В коде есть функция, которая принимает нажатие определенной кнопки и создает новый поток, в котором другая функция делает запрос в БД и после отправляет сообщение пользователю:

@dp.callback_query_handler()
async def callback_respond(callback_query):
    connection = db.DbConnection()

    message = connection.get_data(paper_name='politico')

    await bot.send_message(chat_id=callback_query.from_user.id, text=message)


@dp.callback_query_handler()
async def callback_query_keyboard(callback_query: types.CallbackQuery):
    Thread(target=callback_respond, args=[callback_query]).start()

Проблема в том, что пока поток выполняется, то сам бот перестает работать. Как это исправить?

Ответы

▲ -1

Использовать асинхронность, так как Python Global Interpreter Lock (GIL) — это своеобразная блокировка, позволяющая только одному потоку управлять интерпретатором Python. Это означает, что в любой момент времени будет выполняться только один конкретный поток.

Работа GIL может казаться несущественной для разработчиков, создающих однопоточные программы. Но во многопоточных программах отсутствие GIL может негативно сказываться на производительности процессоро-зависымых программ.

Поскольку GIL позволяет работать только одному потоку даже в многопоточном приложении, он заработал репутацию «печально известной» функции.