当我使用MongoEngine在一个集合中迭代查询超过10万个文档时。它通常以“pymongo.errors.autoreconnect:[errno 54]connection reset by peer”结束。
我已经为autoreconnect检查了其他答案/解决方案,但我怀疑这些是否与我遇到的相同。所以我提出这个问题。
有什么建议可以避免自动连接或我可以做的任何诊断?
以下是我收集到的一些解决方案:
使用try…catch…
使用C扩展名(pymongo_has_c())
使用第三方库,如mongodbproxy
设置关键字参数,如timeout和bulk_size(我试过了,但没有成功)

最佳答案

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

可能更多的解决方案是执行monkey patching操作,但我更希望看到调用的是自定义方法

关于mongodb - 如何处理PyMongo/MongoEngine AutoReconnect?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52734638/

10-12 23:17