【问题标题】:ndb.Tasklet and SyncTasklet with Multiple Nested Functions具有多个嵌套函数的 ndb.Tasklet 和 SyncTasklet
【发布时间】:2013-01-25 17:20:29
【问题描述】:

我正在尝试有效地调用 tasklet 和 subtasklet:

@ndb.tasklet
def getBeds(bed_key):
    bed = yield bed_key.get_asyn()
    bed_info = {}
    ......
    raise ndb.Return(bed_info)

@ndb.tasklet
def getRoom(room_key):
    room = yield room_key.get_async()
    room_info = {}
    ..........
    beds_in_room = map(getBeds,room.beds)
    room_info["beds"] = beds_in_room
    raise ndb.Return(room_info)

@ndb.tasklet
def getBuilding(build_key):
    build = yield build_key.get_async()
    build_info = {}
    ...........
    rooms_in_build = map(getRoom,build.rooms)
    build_info["rooms"] = rooms_in_build

@ndb.toplevel
def getHotel(hotel_obj)
    hotel_inf = {}
    .........
    buildings_in_hotel = map(getBuilding,hotel_obj.buildings)
    hotel_inf["buildings"] = buildings_in_hotel
    return hotel_inf

出于某种原因,我认为@ndb.toplevel 会暂停 getHotel 直到一切完成。不幸的是,buildings_in_hotel 正在返回一个未来列表...

如何完成?

【问题讨论】:

    标签: python google-app-engine asynchronous app-engine-ndb


    【解决方案1】:

    你屈服了!

    当调用一个 tasklet 时,你总是得到一个 future,然后 yield 得到结果。还有并行 yield,您可以在其中产生一个元组或 tasklet 列表(有时称为屏障)。

    beds_in_room = yield map(getBeds,room.beds)
    

    rooms_in_build = yield map(getRoom,build.rooms)
    

    buildings_in_hotel = yield map(getBuilding,hotel_obj.buildings)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2019-03-19
      • 2014-03-13
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      相关资源
      最近更新 更多