Когда я использовал MongoEngine для итеративного запроса более 100 000 документов в коллекции. Обычно это заканчивалось "pymongo.errors.AutoReconnect: [Errno 54] Connection reset by peer".
Я уже проверил другой ответ/решение для AutoReconnect, но сомневаюсь, что это тот же случай, что и тот, который я встретил. Поэтому публикую этот вопрос.
Есть ли какие-нибудь советы, чтобы избежать AutoReconnect или что-нибудь, что я могу сделать для диагностики?
Вот несколько решений, которые я собрал:
- использовать попробовать... поймать...
- использовать расширение c (pymongo_has_c())
- использовать стороннюю библиотеку, например MongoDBProxy
- установить аргумент ключевого слова, такой как timeout и bulk_size (я пытался, но это не сработало)
Ответ 1 · рейтинг 1 · Datalker
MongoProxy не работал у меня из коробки с движком Mongo. И использование try .. except везде раздражает. Наконец я получил такое быстрое решение. Надеюсь, поможет.
import logging
from mongoengine import *
class SafeDocumentMixin:
def save_safe(self, *args, **kwargs):
for attempt in range(5):
try:
return self.save(*args, **kwargs)
except pymongo.errors.AutoReconnect as e:
wait_t = 0.5 * pow(2, attempt) # exponential back off
l.warning("PyMongo auto-reconnecting... %s. Waiting %.1f seconds.", str(e), wait_t)
time.sleep(wait_t)
@classmethod
def objects_safe(cls, *args, **kwargs):
for attempt in range(5):
try:
return cls.objects(*args, **kwargs)
except pymongo.errors.AutoReconnect as e:
wait_t = 0.5 * pow(2, attempt) # exponential back off
logging.warning("PyMongo auto-reconnecting... %s. Waiting %.1f seconds.", str(e), wait_t)
time.sleep(wait_t)
class Person(Document, SafeDocumentMixin):
name = StringField()
age = IntField()
И используя вот так
Person.objects_safe(age='23')
Вероятно, еще более правильным решением было бы выполнить исправление обезьяны, но я предпочитаю видеть, что я звоню пользовательский метод