face_encodings
от изображения эталона лишь однократно, вынося его перед циклом. face_recognition.load_image_file
можно сделать асинхронными с await на каждой.bot.send_photo
и bot.send_message
по отдельности. face_recognition.compare_faces
задача вычислительная, поэтому остается создать несколько процессов согласно количеству ядер процессора минуя очередь, а результатами (вычисленными хэшами) обмениваться через pipe. Есть 3 endpoint во flask, которая возвращает json. Есть 4-й endpoint, который асинхронно обращается к 3-м выше и собирает итоговый json.Зачем? Используй очередь сообщений и отдельный процесс для сбора данных с fetch_url. Клиент не должен ждать пока данные будут получены. Вместо этого для получения результатов можно использовать запросы short polling к серверу или сервер будет сам уведомлять через SSE.
Ruby 3.0 exposes hooks for blocking operations and Async can handle them.
If you want to write something which is based on async, use Async::Queue. Otherwise, if you want to use thread primtives, use them. But if you mix it, and expect concurrency, you better use Ruby 3.
In other words, if you use thread primitives with async on Ruby 2, you will block the reactor.
bot = Bot(token=API_TOKEN)
loop = asyncio.get_event_loop() # В Python 3.7: asyncio.get_running_loop()
dp = Dispatcher(bot, loop=loop)
if message.text == 'a':
dp.loop.create_task(periodic()) # создаем задачу асинхронно и НЕ дожидаемся ее выполнения (await)
print("I'm working hard")
async def periodic():
time.sleep(5) # Delay for 5 seconds.