Я первый раз столкнулся с созданием потоков в пайтон. Я пишу бота для тг с помощью библиотеки aiogram, внутри одной асинхронной функции я создаю новый поток что бы выполнить сторонний код и не заставлять основной поток ожидать. Так выходит что после выполнения стороннего кода мне надо отправить сообщение юзеру в тг, а отправка сообщение подразумевает под собой вызов асинхронной функции, то есть мне нужно теперь с нового синхронного потока вызвать асинхронный. Я достаточного много читал на форумах различных ответов, но я так и не пришел к решению.
Вот мой код:
async def load_link(message : types.Message, state: FSMContext):
await state.finish()
thr = threading.Thread(target=run_test, args=(data, message), name='thr-1').start()
def run_test(data, message):
main.main(data[0]['surname'], data[0]['email'], data[0]['time'], message.text)
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(result(message))
loop.close()
async def result(message):
document = types.InputFile('Result.jpg')
await bot.send_document(chat_id=message.from_user.id, document=document, caption='Тест пройден ', reply_markup=kb_start_client)
os.remove('Result.jpg')
Данный код возвращает ошибку: RuntimeError: Timeout context manager should be used inside a task
У меня вопросы такого характера (прошу извиниться за возможную тупость но я новичок в этом):
1) Можно ли как то реализовать то что я написал выше или как можно это упростить и сделать более рациональным?
2) Если я вызываю асинхронную функцию с синхронной я правильно понимаю что мне не надо ставить Lock или Rlock, потому что асинхронная функция и так будет выполняться одним потоком или это не так?
3) И возможно ли вообще создавать новые потоки асинхронными (я нигде не видел что бы так можно было делать, но это бы упростило мою задачу)
4) Как лучше именовать новые потоки которые будут создаваться в процессе?