pymongo + gevent: бросить мне банан и просто monkey_patch?

Небольшой краткий обзор, который требует большего опыта работы с pymongo, чем у меня есть прямо сейчас:

Являются ли «правильные» части драйвера pymongo написанными на python для вызова gevent monkey_patch() и успешного изменения поведения блокировки pymongo при r/w в «асинхронных» гринлетах gevent?

Если для этого потребуется немного больше работы с gevent и pymongo — но это выполнимо — я был бы более чем готов потратить время, пока я могу получить небольшое руководство по irc.

Спасибо!

Примечание. В небольших масштабах записи mongo не представляют большой проблемы, потому что мы просто ставим в очередь «запрос» на запись перед разблокировкой. НО говоря с fiorix о его искривленном асинхронном драйвере монго (https://github.com/fiorix/mongo-async-python-driver), даже быстрая запись (запросы) монго может вызвать проблемы в асинхронных приложениях в масштабе. (И, конечно же, неблокирующие чтения могут вызвать проблемы с самого начала!)


person egbutter    schedule 23.08.2011    source источник


Ответы (2)


Я использовал PyMongo с Gevent, и вот несколько вещей, на которые вам нужно обратить внимание:

  1. Создайте экземпляр только одного объекта pymongo.Connection, желательно в виде глобальной переменной или переменной уровня модуля. Это важно, потому что Connection имеет внутри себя пул!
  2. Обезьяна исправляет все, или, по крайней мере, ОБА сокета и потока. Из-за использования локальных переменных потока в Connection одного исправления сокета недостаточно.
  3. Не забудьте вызвать end_request, чтобы вернуть соединение с пулом.

Ответ на ваш вопрос: продолжайте, PyMongo отлично работает с Gevent.

person Nam Nguyen    schedule 24.08.2011
comment
спасибо Берни Хакетту из группы mongodb google за это обновление: все еще существует проблема, заключающаяся в том, что у mongo верхний предел пула соединений намного ниже, чем количество гринлетов, которые будут создаваться большинством приложений, если они используют mongo в первую очередь (1000-е из зелени). Некоторые из новейших исправлений mongodb здесь github.com/mgood/mongo-python-driver пытаются заставить gevent хорошо работать с пулом потоков mongo. Вот еще один пример патча, который может работать: code.activestate.com/recipes/. - person egbutter; 26.08.2011
comment
У вас есть или вы знаете какие-либо примеры, показывающие, что PyMongo используется с Gevent? - person William Payne; 03.02.2012
comment
А вот еще один пример патча, который может работать: gist.github.com/1184264 - person kkurian; 04.02.2012

При первоначальной проверке кажется, что он не выполняет никаких операций с сокетами в коде c, поэтому все должно быть в порядке (блокирующие операции должны просто блокировать зеленый поток).

person tmc    schedule 23.08.2011