Мое приложение работает над определением элементов документа и классификацией + извлечением информации в нем. (NER и прогнозы модели классификации) Документ отправляется, обрабатывается, и вся информация отправляется обратно клиенту.
Я использую сервер Gunicorn + Flask. Я пробовал различные комбинации рабочих-оружейников, рабочих классов, потоков и т. Д. c ... но, похоже, все они работают так же, как и приложение, использующее только сервер flask, использующий один процесс.
Я не уверен, что происходит не так. Gunicorn не использует все ядра, так как я предполагаю, что он предварительно разветвляется в главном процессе, но независимо от того, добавляю я 1 рабочего или 4, я не могу улучшить производительность при обслуживании асинхронных c запросов.
В настоящее время:
- 4 asyn c запросов от клиента
- Для Gunicorn установлено 4 рабочих и 2 потока с рабочим классом = gthread
Производительность такая же, как при работе только одного работника. У меня сложилось впечатление, что gunicorn передаст каждый файл каждому работнику, и они смогут обрабатывать документ отдельно. Но это не уменьшает время, необходимое для обработки всех 4 документов. Похоже, что они обрабатываются последовательно или просто работают так, как если бы они обрабатывались одним рабочим.
Мой пример файла конфигурации:
bind:{{server_ip}}:5001
max_requests:1000
max_requests_jitter:2
workers:4 #max_workers()
worker_class:'sync' #or 'gthread' or 'gevent'
threads:3
timeout:1500
worker_connections = 100
daemon:True
access_log_format:'%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
#accesslog:'/Logs/access_request.log'
#errorlog:'/Logs/transactions.log'
capture_output:True
Есть ли способ, которым я могу использовать все ядра? Может быть, реализовать очередь, опросить ее и, возможно, дать каждый файл для обработки каждым ядром в системе?
Я не могу улучшить производительность обслуживания асин c запросов от клиента.
Может ли кто-нибудь помочь мне с тем, что я могу здесь делать неправильно?