私はpython 3.4.3でトルネードとモーターに取り組んでいます。
3つのファイルを取得しました。main.py
、model.py
、 のように名前を付けましょうcore.py
私には3つの機能があり、それぞれに1つずつ...
main.py
def getLoggedIn(request_handler):
# request_handler = tornado.web.RequestHandler()
db = request_handler.settings["db"]
uid = request_handler.get_secure_cookie("uid")
result = model.Session.get(db, uid=uid)
return result.get("_id", None) if result else None
model.py
@classmethod
def get(cls, db, user_id=None, **kwargs):
session = core.Session(db)
return session.get(user_id, **kwargs)
core.py
@gen.coroutine
def get(self, user_id, **kwargs):
params = kwargs
if user_id:
params.update({"_id": ObjectId(user_id)}) #This does not exist in DB
future = self.collection.find_one(params)
print(future) #prints <tornado.concurrent.Future object at 0x04152A90>
result = yield future
print(result) #prints None
return result
呼び出しは次のようになりますgetLoggedIn
=> model.get
=> core.get
core.get で装飾されており
、印刷@gen.coroutine
を呼び出しますが、結果を返し、関数で戻り値を印刷しようとすると、印刷されます。yield self.collection.find_one(params)
print(result)
None
getLoggedIn
これはトルネードの非同期性に関連していると思います.printはyieldの前に呼び出されますが、よくわかりません. 誰かがコルーチン/ジェネレーターの原則と、考えられるさまざまなケースでの動作について説明できれば、非常に役立ちます。