2011-07-20 17 views
7

Buduję interfejs WWW dla skręconej aplikacji i chciałbym używać WSGI zamiast twisted.web bezpośrednio (ponieważ reszta strony to WSGI i mam już znaczną bazę kodów WSGI).Asynchroniczne WSGI z Twisted

The Twisted strona dokumentacji znalazłem o WSGIResource (http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html) stwierdza: Jak każdy inny pojemnik WSGI, ty nie może zrobić niczego asynchronicznego w twoich aplikacjach WSGI, nawet jeśli jest to kontener Twisted WSGI.

Czy to musi być prawda? Czy jest jakiś mniejszy od hakerów sposób obsługi asynchronicznego żądania stron internetowych w systemie WSGI w stylu twisted.web - być może w ramach innego projektu wolnego oprogramowania? Przypuśćmy, że nie, moim planem jest, aby wątki WSGI wykonywały swoje asynchroniczne prace w wątku reaktora i blokowały przez sondowanie, dopóki dane nie będą dostępne. To nie jest piękne.

Jeśli istnieje dość nieskomplikowany sposób asynchronicznego obsługiwania żądań WSGI w skręcie, chciałbym to usłyszeć.

+1

Uruchamianie wsgi z twisted's threadpool w całkiem prosty sposób, zobacz http://stackoverflow.com/questions/5248825/web-interface-for-a-twisted-application –

+0

Za to, co jest warte, naprawdę podoba mi się 'twistd web' do pojemników wsgi w produkcji. Konfiguracja jest łatwiejsza niż 'cherryd' i jest dużo bardziej wygodna i bardziej trwała niż Apache + mod_wsgi. – SingleNegationElimination

Odpowiedz

5

Dlaczego chcesz używać WSGI i robić asynchroniczne rzeczy? Zaletą WSGI jest możliwość wdrożenia aplikacji na dowolnym kontenerze WSGI. Jeśli zaczniesz używać Twisted APIs do wykonywania zadań asynchronicznych, możesz wdrożyć aplikację tylko w kontenerze WSGI Twisted.

Powinieneś po prostu używać Twisted Web bez WSGI do asynchronicznego kodu.

+1

Jest to jeden z elementów większej aplikacji webowej opartej na WSGI - jedynej części, która musi pracować ze skręconymi - więc miałem nadzieję uniknąć wielokrotnego przepisywania tego opartego na WSGI. W każdym razie masz rację, zamiast tego użyję Twilight Twisted Web. –

+1

Możesz również użyć wanilii Twisted Web, aby połączyć się z tą samą bazą kodową, która ma również interfejs WSGI. Naprawdę, Twisted Web to tylko kilka metod - 'getChild',' render_GET', 'render_POST' - które implementujesz, aby odsłonić swoją aplikację. Musisz więc napisać trochę kodu z klejem na granicy, ale naprawdę nie powinieneś od nowa pisać wszystkiego od zera tylko po to, żeby użyć tego interfejsu. – Glyph

5

Zasadniczo WSGI nie jest wewnętrznie niezgodny z projektem asynchronicznego programu; w rzeczywistości PEP 333 ma znaczną długość, aby określić, jak serwery, aplikacje i oprogramowanie pośrednie muszą się zachowywać, aby wspierać tego rodzaju rzeczy.

Sercem tego jest zwracanie do kontenera iteratora. Za każdym razem, gdy wywoływany jest asynchroniczny wsgi app.sys, sprawdzane są wszystkie oczekujące asynchroniczne zadania (połączenia z bazą danych itp.) I jeśli którykolwiek z nich ma dane, to app_iter dostarcza pewnych danych; w przeciwnym razie powstanie pusty ciąg znaków. Aby temu zaradzić, kontener wsgi będzie musiał śledzić wszystkie żądania w locie, a następnie iterować każdy z nich po kolei, aby uzyskać więcej danych, oprócz obsługi jakiejkolwiek innej odroczonej pracy, za którą jest odpowiedzialny.

W zasadzie bardzo niewiele aplikacji lub frameworków wsgi to robi. prawie zawsze, struktury wsgi blokują z różnych powodów; czytanie plików z dysku lub ładowanie danych z bazy danych z jakiegokolwiek powodu (większość ORM sprawia, że ​​jest to trudny problem, aby temu zapobiec.) Twisted's wsgi container działa przy założeniu, że ponieważ niektóre aplikacje wsgi blokują, być może każda aplikacja wsgi może blokować, i dlatego zawsze uruchamia je w wątku.

Są dwie rzeczy, które możesz zrobić; albo zbadaj własne ramy internetowe twisted, które są dość solidne; lub rozważ utworzenie opakowania wsgi dla skręcenia poza własnym kontenerem skręconym. Upewnienie się, że aplikacja wsgi jest rzeczywiście asynchroniczna, jest z pewnością warunkiem wstępnym tego drugiego, ale samo wsgi jest dość proste, cienkie opakowanie na http, więc powinno być dość łatwe.