如何在单独的数据访问层中正确使用电机

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