Как обращаться с PyMongo / MongoEngine AutoReconnect? - PullRequest
0 голосов
/ 10 октября 2018

Когда я использовал MongoEngine для итеративного запроса более 100К документов в коллекции.Обычно это заканчивалось "pymongo.errors.AutoReconnect: [Errno 54] Сброс соединения по пиру".

Я уже проверил другой ответ / решение для AutoReconnect, но я сомневаюсь, что теэто тот же случай, что и тот, который я встретил.Поэтому я отправляю этот вопрос.

Есть ли какие-либо советы, чтобы избежать AutoReconnect или что я могу сделать для диагностики?

Вот некоторые решения, которые я собрал:

  1. use try ... catch...
  2. использовать расширение c (pymongo_has_c ())
  3. использовать стороннюю библиотеку, такую ​​как MongoDBProxy
  4. установить аргумент ключевого слова, например timeout и bulk_size (я пытался, но это не так)т работы)

1 Ответ

0 голосов
/ 27 июня 2019

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')

Возможно, еще более удачным решением будет исправление обезьян , но я предпочитаю видеть, что я 'м вызывая пользовательский метод

...