当我使用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/