sql >> Base de Datos >  >> NoSQL >> MongoDB

Error de tornado:[Errno 24] Error de demasiados archivos abiertos

Muy simple, el objeto RequestHandler se instancia para cada solicitud. Lo que significa que el objeto almacenado en caché que está guardando está en el objeto RequestHandler (por ejemplo, expandir).

Si agregara un simple "imprimir '¡CREADO!'" a la función dbmongo(...) vería que se crea en cada solicitud GET.

Lo que debe hacer es adjuntar el controlador al objeto de clase, o un "global" según sea necesario, aunque el mejor caso es colocarlo en el objeto Aplicación Tornado.

Sencillo:

class setup(tornado.web.RequestHandler):
    @classmethod
    def dbmongo(cls):
        if not hasattr(cls, '_dbmongo'):
            cls._dbmongo = apymongo.Connection("127.0.0.1", 27017)
        return cls._dbmongo

El segundo enfoque es simplemente convertirlo en global en su archivo:

dbmongo_connection = None
def dbmongo():
    if not dbmongo_connection:
        dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
    return dbmongo_connection

Ambos tienen el mismo problema, que es que si tiene muchas clases que quieren usar la conexión DB, es más difícil compartirla. Dado que la base de datos es una entidad compartida, probablemente desee una para toda su aplicación.

class MongoMixin(object):
    def mongodb(self):
        if not hasattr(self.application, 'mongodb'):
            self.application.mongodb = apymongo.Connection(self.application.settings.get("mongohost", "127.0.0.1"), 27017)
        return self.application.mongodb

class expand(tornado.web.RequestHandler, MongoMixin):
    def get(self):
       db = self.mongodb()