Pymongo, пул соединений и асинхронные задачи через Celery - PullRequest
0 голосов
/ 08 августа 2011

Я использую pymongo для доступа к mongodb в приложении, которое также использует Celery для выполнения многих асинхронных задач. Я знаю, что пул соединений Pymongo не поддерживает асинхронных рабочих (на основе документов).

Для доступа к коллекциям у меня есть класс Collection, заключающий в себе определенную логику, которая подходит моему приложению. Я пытаюсь разобраться в некотором коде, который я унаследовал с помощью этой оболочки:

  • Каждая коллекция в настоящий момент создает свой собственный экземпляр Connection. Исходя из того, что я читаю, это неправильно, и у меня действительно должен быть один экземпляр Connection (в settings.py или около того) и импортировать его в мои экземпляры Collection. Это немного понятно. Есть ли рекомендации по максимальному количеству рекомендуемых соединений? Текущий код, безусловно, создает МНОГО соединений / сокетов, так как он на самом деле не использует средства объединения.

  • Однако, поскольку некоторый код вызывается как из асинхронных задач сельдерея, так и из-за синхронного запуска, я не уверен, как с этим справиться. Моя мысль состоит в том, чтобы создать новые экземпляры Connection для задач и использовать один для синхронных (конечно, final_request после выполнения каждого действия). Это правильное направление?

Спасибо!

Harel

1 Ответ

0 голосов
/ 17 сентября 2011

Из документов Pymongo: «PyMongo является поточно-ориентированным и даже обеспечивает встроенный пул соединений для многопоточных приложений».

Слово «асинхронный» в вашей ситуации можно перевести как «противоречивые» требования к вашему приложению.

Выражения типа "x + = 1" никогда не будут последовательными в вашем приложении. Если вы можете себе это позволить, проблем нет. Если у вас есть «критические» операции, вы должны каким-то образом реализовать некоторые блокировки для синхронизации.

Что касается максимальных соединений, я не знаю точных чисел, поэтому протестируйте и продолжайте.

Также взгляните на Redis и этот пример , если требуются скорость и эффективность памяти. Из некоторых тестов, которые я сделал, драйвер Python Redis по крайней мере в 2 раза быстрее, чем pymongo, для чтения / записи.

...