Я не думаю, что есть элегантный способ. Pymongo имеет исключение AutoReconnect , которое генерируется в случае потери ранее установленного соединения. Вы должны перехватить это исключение и повторить операцию, которая приведет к восстановлению соединения.
Относительно безболезненный способ обработки AutoReconnects, который я нашел, состоит в том, чтобы изолировать операции с БД в отдельных методах и обернуть их декоратором, подобным этому:
from pymongo.errors import AutoReconnect
def autoreconnect_retry(fn, retries=3):
def db_op_wrapper(*args, **kwargs):
tries = 0
while tries < retries:
try:
return fn(*args, **kwargs)
except AutoReconnect:
tries += 1
raise Exception("No luck even after %d retries" % retries)
return db_op_wrapper
Использование:
@autoreconnect_retry
def insert_foo_record(foo):
# Perform db operation
pass
@autoreconnect_retry(20)
def get_foo_record(id):
# Perform db operation
pass