Tak więc piszę kolejny demon oparty na Twisted. Będzie miał zwykły interfejs xmlrpc, dzięki czemu będę mógł łatwo komunikować się z nim, a inne procesy będą wymieniać z nim dane w razie potrzeby.Twisted + SQLAlchemy i najlepszy sposób na zrobienie tego
Ten demon musi mieć dostęp do bazy danych. Używamy SQL Alchemy zamiast twardych kodowania ciągów SQL dla naszych najnowszych projektów - najczęściej wykonywanych dla aplikacji internetowych w Pylonach.
Chcielibyśmy zrobić to samo dla tej aplikacji i ponownie użyć kodu biblioteki, który korzysta z SQL Alchemy. Więc co robić? No cóż, skoro ta biblioteka została napisana do użycia w aplikacji Pylons, to jest to prosty kod blokujący, do którego wszyscy są przyzwyczajeni, a wszystkie elementy nieblokujące są obsługiwane magicznie przez Pylony za pośrednictwem wątków, lokacji wątków i sesji na.
Teraz dla Twisted Myślę, że trochę utknąłem. Mógłbym:
- Wystarczy napisać sql muszę bezpośrednio, czy to minimalne i korzystać z basenu dbapi w skręcona zrobić runInteractions etc kiedy trzeba uderzyć db.
- Korzystaj z obiektów i z natury blokuj metody w naszej bibliotece, a następnie blokuj w moim demonie Twisted. Bah.
- Użyj sAsync, który został ostatnio zaktualizowany w 2008 roku i ponownie używaj modeli, które już zdefiniowaliśmy, ale nie za bardzo, a to nie rozwiązuje problemu, że kod biblioteki musi działać również w Pylonach. Czy to działa nawet z najnowszą wersją SQL Alchemy? Kto wie. Ten projekt wyglądał świetnie - dlaczego został najwyraźniej porzucony?
- Pomiń oddzielny podproces i pozwól mu poradzić sobie z kodem biblioteki i wszystkim, co blokuje, a wyniki są zwracane do mojego demona, gdy będą gotowe, gdy obiekty są przekierowywane przez YAML ponad xmlrpc.
- Użyj funkcji deferToThread, a następnie zniszcz obiekty, które zostały zwrócone, upewniając się, że wykonujesz niecierpliwe ładunki, aby mieć wszystkie potrzebne rzeczy. Wydaje mi się, że to trochę ugha.
Jestem również zatrzymany przy użyciu Python 2.5.4 atm więc jeszcze nie 2.6 i nie sądzę, mogę po prostu zrobić import z przyszłości, aby uzyskać dostęp do nowego modułu wieloprocesorowe chłodnym rzeczy tam. Zgadza się, ale dość dobrze radzimy sobie z komunikacją międzyprocesową.
Tak więc pochylam się w kierunku opcji 4 głównie w taki sposób, aby uniknąć śmiertelnego grzechu powielania logiki z opcją 1, jednocześnie pozostając przy tym z dala od wątków.
Moja pierwsza próba będzie jednak opcją 2, aby po prostu uruchomić to, a następnie oddzielić połączenia do kodu bibliotecznego, być może, do osobnego procesu, jeśli wygląda na to, że istnieje spora szansa, że coś może zająć trochę czasu blokować. Smutny. Może interesujące byłoby tu połączenie Stackless Python i Twisted.
Jakieś lepsze pomysły?
Dzięki Jacob - Próbowałem Storm po raz pierwszy jesienią zanim zdecydowałem się na SQL Alchemy. Wstawianie danych było wówczas niedopuszczalnie powolne w Storm. Być może to już nie jest problem - przyjmowanie od 2 do 3 sekund na insert w MySQL dla jednej z naszych tabel. Użyłem również runInteration i runQuery w skręcie z ich pulami połączeń i to działa świetnie. Chodzi o to, że chcę, żeby działał także w świecie Pylonów. Następną rzeczą, na którą warto zwrócić uwagę, jest [Eventlet] (http://eventlet.net/) i [gevent] (http://www.gevent.org/). Ten ostatni powinien być szybszy/lepszy, ale nie można go z Twisted . – Khorkrak
Link nie działa. Czy to jest to? http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html –
Dzięki! Zaktualizowany nowym łączem. –