Асинхронный WSGI с Twisted

Я создаю веб-интерфейс для скрученного приложения и хотел бы использовать WSGI, а не скрученный.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 выполняли свою асинхронную работу в потоке реактора и блокировались путем опроса, пока данные не будут доступны. Это некрасиво.

Если есть достаточно простой способ асинхронной обработки запросов WSGI в Twisted, я бы хотел его услышать.


person S. H. Mookey    schedule 20.07.2011    source источник
comment
Запуск wsgi с пулом потоков Twisted довольно прост, см. stackoverflow.com/questions/5248825/   -  person Jochen Ritzel    schedule 20.07.2011
comment
Что бы это ни стоило, мне на самом деле очень нравится twistd web для контейнеров wsgi в производстве. Его проще настроить, чем cherryd, он намного быстрее и надежнее, чем Apache+mod_wsgi.   -  person SingleNegationElimination    schedule 06.09.2011


Ответы (2)


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

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

person Jean-Paul Calderone    schedule 20.07.2011
comment
Это один из компонентов более крупного веб-приложения на основе WSGI — единственная часть, которая должна работать с Twisted — поэтому я надеялся избежать большого переписывания этого фреймворка на основе WSGI. В любом случае, вы правы, вместо этого я собираюсь использовать ванильную Twisted Web. - person S. H. Mookey; 20.07.2011
comment
Вы также можете использовать vanilla Twisted Web для вызова той же кодовой базы, которая также имеет интерфейс WSGI. На самом деле, Twisted Web — это всего лишь пара методов — getChild, render_GET, render_POST — которые вы реализуете для раскрытия своего приложения. Таким образом, вам нужно будет написать небольшой связующий код на границе, но вам действительно не нужно переписывать все с нуля только для того, чтобы использовать этот интерфейс. - person Glyph; 20.07.2011

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

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

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

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

person SingleNegationElimination    schedule 06.09.2011