Pymongo + gevent: бросьте мне банан и просто monkey_patch?
Quickie здесь, где вам нужно больше знаний о доменах на pymongo, чем я сейчас:
Являются ли "правильные" части драйвера pymongo, написанные на python, для вызова gevent monkey_patch() и успешно изменяют поведение блокировки pymongo на r/w в gevent "асинхронных" озерах?
Если для этого понадобится немного больше работы на gevent и pymongo - но это выполнимо - я бы более чем хотел поставить время, пока я могу получить небольшое руководство по irc.
Спасибо!
Примечание. В небольших масштабах записи mongo не являются большой проблемой, потому что мы просто ставим "запрос" для записи перед разблокировкой. НО поговорив с fiorix о своем искривленном асинхронном монго (https://github.com/fiorix/mongo-async-python-driver), даже быстрая запись (запросы) манго может вызвать проблемы в асинхронных приложениях в масштабе. (И, конечно, неблокирующие чтения могут вызвать проблемы с самого начала!)
Ответы
Ответ 1
Я использовал PyMongo с Gevent, и вот несколько вещей, которые вам нужно соблюдать:
- Создавать только один объект
pymongo.Connection
, предпочтительно как глобальную или модульную переменную. Это важно, потому что Connection
имеет в себе пул!
- Обезьяна патчит все, или, по крайней мере, BOTH сокет и потоки. Из-за использования локаторов потоков в
Connection
недостаточно одного исправления.
- Не забудьте вызвать
end_request
, чтобы вернуть соединение с пулом.
Ответ на ваш вопрос идет дальше, PyMongo отлично работает с Gevent.
Ответ 2
При первоначальной проверке он не выполняет никаких операций сокета в коде c, поэтому он должен быть точным (блокировка ops должна просто блокировать зеленую нить).