3

タスクレットとサブタスクレットを効率的に呼び出そうとしています。

@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は先物のリストを返しています...

どうすれば完了できますか?

4

1 に答える 1

3

あなたは譲ります!

タスクレットを呼び出すとき、あなたは常に未来を手に入れ、そして結果を得るために譲歩します。タプルまたはタスクレットのリスト(バリアと呼ばれることもあります)を生成する並列yieldもあります。

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)
于 2013-01-25T21:12:44.707 に答える