2011-08-23 14 views
13

Quickie tutaj, że potrzebuje więcej wiedzy domeny na pymongo niż mam teraz:pymongo + gevent: rzuć mi banana i tylko monkey_patch?

są części „prawo” sterownika pymongo napisany w Pythonie dla mnie nazywają gevent monkey_patch() i skutecznie zmieniać pymongo'S zachowanie na R blokujące/w obrębie zielonych "asynchronicznych"?

Jeśli będzie to wymagało trochę więcej pracy nóg nad gevent i pymongo - ale jest to wykonalne - byłbym bardziej niż skłonny poświęcić czas tak długo, jak mogę uzyskać pewne wskazówki dotyczące irc.

Dzięki!

Uwaga: Na małą skalę zapisywanie mongo nie stanowi większego problemu, ponieważ przed odblokowaniem oczekujemy w kolejce "żądania" zapisu. ALE rozmowy z fiorix na temat jego przekręconego asynchronicznego mongo sterownika (https://github.com/fiorix/mongo-async-python-driver), nawet szybkie zapisywanie mongo (żądania) może powodować problemy w aplikacjach asynchronicznych na dużą skalę. (Oczywiście, nie blokujące odczyty mogą powodować problemy od samego początku!)

Odpowiedz

18

Użyłem PyMongo z Gevent i oto kilka rzeczy, które trzeba zwrócić uwagę:

tylko jeden pymongo.Connection
  1. instancję obiektu, a najlepiej jako zmienną globalną lub moduł poziomu. Jest to ważne, ponieważ Connection ma w sobie pulę!
  2. Małpa załataj wszystko, a przynajmniej ZARÓWNO gniazdo i gwintowanie. Ze względu na użycie lokalnych wątków w Connection samo podłączanie gniazd nie wystarczy.
  3. Pamiętaj, aby zadzwonić pod numer end_request, aby przywrócić połączenie z pulą.

Odpowiedź na pytanie brzmi: PyMongo działa dobrze z Gevent.

+0

dziękuję Bernie Hackettowi z grupy mongodb google za tę aktualizację: nadal istnieje problem, że mongo ma górny limit puli połączeń dużo niższy niż liczba greenletów, które większość aplikacji będzie spawnować, jeśli używają mongo w pierwsze miejsce (1000 s greenletów). Niektóre z najnowszych łatek mongodb tutaj https://github.com/mgood/mongo-python-driver są próbą sprawienia, by gevent grał ładnie z łączeniem wątków mongo. Oto kolejny przykład poprawki, która * może * działa: http://code.activestate.com/recipes/577490-mongodb-pool-for-gevent-and-pymongo-packages/. – egbutter

+0

Czy znasz lub znasz przykłady, które pokazują, że PyMongo jest używane z Gevent? –

+0

Oto kolejny przykład łaty, która może działać: https://gist.github.com/1184264 – kkurian

2

Podczas początkowej inspekcji nie wydaje się, aby operacje w kodzie były wykonywane w kodzie c, więc powinno być dobrze (blokowanie operacji powinno po prostu zablokować zielona nić).