Twisted + SQLAlchemy i najlepszy sposób na to

Więc piszę kolejny Pokręcony daemon. Będzie miał jak zwykle interfejs xmlrpc, dzięki czemu będę mógł łatwo się z nim komunikować i mieć inne procesy wymieniające dane z nim w razie potrzeby.

Ten Demon musi uzyskać dostęp do bazy danych. Używamy SQL Alchemy zamiast twardych ciągów SQL do naszych najnowszych projektów-głównie dla aplikacji internetowych w pylonach.

Chcielibyśmy zrobić to samo dla tej aplikacji i ponownie użyć kodu biblioteki, która korzysta z SQL Alchemy. Więc co do zrobić? Oczywiście, ponieważ biblioteka została napisana do użytku w aplikacji pylonów, jest to cały prosty kod blokujący, do którego wszyscy są przyzwyczajeni, a wszystkie nieblokujące są magicznie obsługiwane przez pylony za pomocą wątków, lokalnych wątków, sesji zakresowych i tak dalej.

Więc teraz dla Twisted chyba trochę utknąłem. Mógłbym:

  1. po prostu napisz SQL, którego potrzebuję bezpośrednio, jeśli jest minimalny i użyj puli dbapi w twisted, aby zrobić runInteractions itp., gdy muszę uderzyć w db.
  2. użyj obiektów i metod z natury blokujących w naszej bibliotece i blokuj od czasu do czasu w moim pokręconym Demonie. Bah.
  3. użyj sAsync, który został ostatnio zaktualizowany w 2008 roku i użyj ponownie modeli, które już zdefiniowaliśmy, ale nie do końca i nie odnosi się to do tego, że kod biblioteki musi działać również w pylonach. Czy to w ogóle działa z najnowszą wersją SQL Alchemy? Kto wie. Ten projekt wyglądał jednak świetnie - dlaczego najwyraźniej został porzucony?
  4. Spawn a separate podprocesować i mieć do czynienia z kodem biblioteki i wszystkim, co blokuje, wyniki są zwracane z powrotem do mojego demona, gdy są gotowe jako obiekty przenoszone przez YAML nad xmlrpc.
  5. użyj deferToThread, a następnie Usuń obiekty zwrócone po upewnieniu się, że wykonam chętne ładunki, aby mieć wszystkie moje rzeczy, które mogą być potrzebne. Wydaje mi się trochę ugha.

Ja też utknąłem używając Pythona 2.5.4 atm więc nie ma jeszcze 2.6 i nie sądzę, żebym mógł po prostu zrobić import z przyszłości, aby uzyskać dostęp do fajnego nowy moduł wieloprocesorowy. To jest OK, choć myślę, że jak mamy do czynienia z komunikacji międzyprocesowej w dół całkiem dobrze.

Więc skłaniam się głównie do opcji 4, ponieważ uniknęłoby to śmiertelnego grzechu powielania logiki z opcją 1, jednocześnie trzymając się z dala od wątków.

Moją pierwszą próbą będzie jednak opcja 2, aby po prostu uruchomić to, a następnie oddzielić wywołania do kodu biblioteki, być może w osobnym procesie, jeśli wygląda na to, że jest duża szansa, że coś może potrwać zbyt długo, by się zablokować. Smutne. Może połączenie bezstopniowego pytona i skręconego byłoby tutaj interesujące.

Jakieś lepsze pomysły?

Author: Khorkrak, 2010-06-10

4 answers

Po pierwsze, mogę niestety tylko poprzeć Twoją opinię, że pokręcone i SQLAlchemy nie grają zbyt dobrze. Pracowałam z obydwoma i obawiałby się nieco złożoności, która wynikałaby z składam je razem.

Wszystkie warstwy integracji baz danych, które znam do tej pory, używają Twisted threading integration layer, a jeśli chcesz tego uniknąć w wszystkie koszty jesteś dość dużo utknął z punktu 4 na liście.

Z drugiej strony widziałem przykłady kod łączący bazę danych używanie defertothread () i friends, które działały bardzo dobrze.

Anyway, some pointers if you ' d be ready to consider other Framework niż SQLAlchemy:

Chłopaki z DivMod 'a od dawna pracują nad twisted' em - integracja baz danych oparta na Storm ORM (google dla "storm orm").

Zobacz ten link dla przykładu:

Http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html

Również udaj się do Strona divmoda i zajrzyj do źródeł ich aksjomat db layer (prawdopodobnie nie ma żadnego zastosowania bezpośrednio od tylko Sqlite, ale może się przydać).

 6
Author: Jacob Oscarson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 11:02:58

W ciągu kilku lat Alex Gaynor stworzył https://github.com/alex/alchimia które może być lepszym centralnym repozytorium do integracji z SQLAlchemy i Twisted.

 10
Author: Glyph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-08 17:37:53

Istnieje gałąź storm, której możesz użyć bezpośrednio z twisted (wewnętrznie odkłada się na wątek) na launchpad https://code.launchpad.net / ~ therve / storm / twisted-integration . użyłem go ładnie.

Niestety SQLAlchemy jest znacznie bardziej złożony w implementacji do audytu pod kątem użycia asynchronicznego. Jeśli naprawdę chcesz go użyć, polecam podejście poza procesem z warstwą RPC pamięci masowej.

Alternatywnie, jeśli masz ochotę na przygodę i korzystasz z postgresql, najnowszy pyscopg2 obsługuje prawdziwe użycie asynchroniczne (https://launchpad.net/txpostgres [[2]}), a źródło burzy jest dość proste do zhakowania; -)

Nawiasem mówiąc Burza, którą próbowałeś w zeszłym roku, może nie mieć domyślnie włączonego rozszerzenia C (jest teraz w najnowszych wydaniach.), co może tłumaczyć Twoje problemy z prędkością.

 6
Author: kapilt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 04:35:33

Być może twistar jest tym, czego szukasz. Jest to natywna implementacja active record (aka ORM) dla twisted, pracująca na szczycie twisted.enterprise.adbapi.

Http://findingscience.com/twistar/

 3
Author: fiorix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 23:32:55