Варианты флаконов для достижения истинной многопоточности?

Я реализовал многопоточный веб-сервер, используя фреймворк micro framework. В принципе, у моего сервера есть очередь задач и пул потоков. Следовательно, он может обрабатывать несколько запросов. Поскольку Flask реализован в потоках Python и Python, они не являются одновременно параллельными, мое веб-приложение немного отсталое.

Есть ли альтернативы Flask для решения проблемы многопоточности?

Ответ 1

Я столкнулся с этим вопросом, и я был немного разочарован, никто не указал, как фляжка (и большинство веб-приложений python предназначены для развертывания). См.: http://flask.pocoo.org/docs/deploying/#deployment

Мой предпочтительный вариант развертывания - это супер-простой Tornado, который одинаково хорошо работает в Linux и Windows (если я развертываю его вместе с существующими веб-сайтами или даже гибридное развертывание как часть существующего сайта, я обычно использую маршрутизацию запросов приложений IIS [ARR] в качестве обратного прокси-сервера для торнадо). Я также использовал gevent на обоих с большим успехом.

Tornado - это версия с открытым исходным кодом масштабируемого, неблокирующего веб-сервера и инструментов, которые поддерживают FriendFeed. Поскольку он не блокирует и использует epoll, он может обрабатывать тысячи одновременных постоянных подключений, что означает, что он идеально подходит для веб-сервисов реального времени. Интеграция этой службы с Flask проста:

Итак, если ваше флеш-приложение находится в файле yourapplication.py, вы можете создать другое имя tornado_web.py и использовать его для обслуживания своего приложения следующим образом:

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()

через: http://flask.pocoo.org/docs/deploying/wsgi-standalone/#tornado

Ответ 2

Это не ошибка Flask, это ограничение в интерпретаторе Python, поэтому любая используемая вами инфраструктура будет подчиняться ей.

Но есть отличный способ избежать этой проблемы. Чтобы иметь истинное совпадение, вы можете использовать пул процессов вместо потоков. Модуль multiprocessing предоставляет API, который совместим с интерфейсом модуля потоковой передачи, но создает дочерние процессы для рабочих. Я использовал этот модуль для создания фоновых работников для приложений Flask и нашел, что он работает очень хорошо.