Асинхронный WSGI с витой - PullRequest
7 голосов
/ 20 июля 2011

Я создаю веб-интерфейс для витого приложения и хотел бы использовать WSGI, а не twisted.web напрямую (поскольку остальная часть веб-сайта - WSGI, и у меня уже есть существенная кодовая база WSGI).

Страница документации Twisted, которую я нашел о WSGIResource (http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html) состояния: Как и любой другой контейнер WSGI, вы не можете делать ничего асинхронного в своих приложениях WSGI, даже если это контейнер Twisted WSGI.

Должно ли это быть правдой? Существует ли какой-то нехитрый способ выполнения асинхронной обработки веб-запросов в стиле twisted.web в WSGI - возможно, в рамках другого проекта свободного программного обеспечения? Предположим, что нет, мой плансостоит в том, чтобы потоки WSGI выполняли свою асинхронную работу в потоке реактора и блокировали его, опрашивая до тех пор, пока данные не станут доступными. Это не очень красиво.услышать это.

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

В принципе, WSGI не является несовместимым с асинхронным проектированием программ; на самом деле, PEP 333 идет довольно далеко, чтобы указать, как серверы, приложения и промежуточное ПО должны вести себя для поддержки такого рода вещей.

В основе этого лежит возврат итератора в контейнер. Каждый раз, когда вызывается асинхронный wsgi app_iter, он проверяет все ожидающие его асинхронные задачи (соединения с базой данных и т. Д.), И если у какой-либо из них есть данные, app_iter возвращает некоторые данные; в противном случае он возвращает пустую строку. Для поддержки этого контейнеру wsgi необходимо отслеживать все запросы в полете и повторять каждый из них по очереди, чтобы получать больше данных, в дополнение к обслуживанию любой другой отложенной работы, за которую он отвечает.

В принципе, очень немногие wsgi-приложения или фреймворки действительно делают это. почти всегда блоки wsgi блокируются по разным причинам; чтение файлов с диска или загрузка данных из базы данных по какой-либо причине вообще (большинство ORM делают эту проблему непростой задачей). Контейнер wsgi Twisted работает в предположении, что, поскольку некоторые приложения wsgi блокируют, что, возможно, любое приложение wsgi может блокировать, и поэтому всегда запускает их в потоке.

Есть две вещи, которые вы можете сделать; либо изучите собственный веб-фреймворк Twisted, который достаточно прочный или подумайте о создании оболочки wsgi для витой вне собственного витого контейнера. Убедиться, что приложение wsgi на самом деле асинхронно, безусловно, является предварительным условием последнего, но сам wsgi довольно прост, тонкая оболочка над http, и поэтому он должен быть достаточно легким.

5 голосов
/ 20 июля 2011

Почему вы хотите использовать WSGI и выполнять асинхронные операции?Преимущество WSGI заключается в том, что вы можете развернуть свое приложение в любом контейнере WSGI.Если вы начнете использовать Twisted API для выполнения асинхронных операций, вы сможете развернуть свое приложение только в контейнере WSGI в Twisted.

Возможно, вам просто следует использовать Twisted Web без WSGI для своего асинхронного кода.

...