Пул соединений pymongo и клиентские запросы

Я знаю, что pymongo является потокобезопасным и имеет встроенный пул соединений.

В веб-приложении, над которым я работаю, я создаю новый экземпляр подключения для каждого запроса.

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

Я исправлю здесь, или я должен просто создать один экземпляр для использования по нескольким запросам?

Ответы

Ответ 1

"Неправильный подход" зависит от архитектуры вашего приложения. Поскольку pymongo является поточно-безопасным и автоматическим пулом соединений, фактическое использование единого общего подключения или нескольких соединений будет "работать". Но результаты будут зависеть от того, что вы ожидаете от поведения. Комментарии к документации по обоим случаям.

Если ваше приложение пронумеровано, из документов каждый поток, обращающийся к соединению, получит свой собственный сокет. Таким образом, независимо от того, создаете ли вы одно общее соединение или запрашиваете новый, все зависит от того, были ли ваши запросы потоковыми или нет.

При использовании gevent вы можете иметь сокет на каждую зеленую букву. Это означает, что вам не нужно иметь истинный поток для каждого запроса. Запросы могут быть асинхронными и все еще получать свой собственный сокет.

В двух словах:

  • Если ваши запросы в Webapp потоковом, то не имеет значения, каким образом вы получаете доступ к новому соединению. Результат будет таким же (сокет на поток)
  • Если ваш webapp асинхронный через gevent, то не имеет значения, каким образом вы получаете доступ к новому коннектору. Результат будет таким же. (гнездо на каждую буклет)
  • Если ваш webapp является асинхронным, но НЕ через gevent, тогда вы должны учитывать примечания в наилучшем предлагаемом рабочем процессе.