如何在单独的数据访问层中正确使用电机
How use properly Motor in separate data access layer
我开始了一个使用龙卷风和马达的小项目,
如果我想要非阻塞访问,我对如何处理访问数据层感到有些困惑
通常我用这种结构来分离我的项目
root_project
-logic
-data
--UsersDao
-handlers
--Users
-main.py
但我不知道如果我做这样的事情连接将是非阻塞的
@gen.coroutine
@tornado.web.asynchronous
def get(self, id):
users = self.settings["User"]
result = yield from users.get(id)
self.write(json_encode(result))
self.finish()
'users' 这是我的 UsersDao 对象,看起来像
class UsersDao(object):
....
def get(self, user, callback=None):
try:
user = yield self._db["users"].find_one({'_id': user})
...create user object
return user
except ValueError:
pass
except OperationFailure:
pass
except Exception:
raise
一般来说,只要您使用 yield
,您就在做某事 asynchronous/non-blocking。因此,在这种情况下,您发布的代码看起来是正确的,除了 UsersDao.get
上缺少 @gen.coroutine
装饰器(每当您将 yield
用于异步内容时,您都需要这个装饰器,并且您需要每次调用时都使用 yield
)。
我开始了一个使用龙卷风和马达的小项目, 如果我想要非阻塞访问,我对如何处理访问数据层感到有些困惑
通常我用这种结构来分离我的项目
root_project
-logic
-data
--UsersDao
-handlers
--Users
-main.py
但我不知道如果我做这样的事情连接将是非阻塞的
@gen.coroutine
@tornado.web.asynchronous
def get(self, id):
users = self.settings["User"]
result = yield from users.get(id)
self.write(json_encode(result))
self.finish()
'users' 这是我的 UsersDao 对象,看起来像
class UsersDao(object):
....
def get(self, user, callback=None):
try:
user = yield self._db["users"].find_one({'_id': user})
...create user object
return user
except ValueError:
pass
except OperationFailure:
pass
except Exception:
raise
一般来说,只要您使用 yield
,您就在做某事 asynchronous/non-blocking。因此,在这种情况下,您发布的代码看起来是正确的,除了 UsersDao.get
上缺少 @gen.coroutine
装饰器(每当您将 yield
用于异步内容时,您都需要这个装饰器,并且您需要每次调用时都使用 yield
)。