GAE/PのAsync Datastore APIの使い方

Google App Engine(Python)には、Async Datastore APIというAPIが用意されています。これを使用すると、非同期にDatastoreからデータを取得したり、削除や更新などができます。

ドキュメントに記載されていますが、使いどころはそれぞれ独立した、複数のクエリを発行した後に画面をレンダリングするような場合です。こういった場合、バックグラウンドでパラレルにクエリを同期に実行できるため、画面描画までの待ち時間が短くなります。

逆に、Datastoreのアクセスが1回のみで画面をレンダリングする場合などは、非同期で実行してもレイテンシの改善にはつながらないみたいです。

イメージ(多分こんな感じです)

・Async Datastore APIを使わない
  クエリAを実行
    ↓
    ↓  Aの結果が返ってくるまで処理はブロックされる
    ↓
  クエリAの結果取得
    ↓
  クエリBを実行
    ↓
    ↓  Bの結果が返ってくるまで処理はブロックされる
    ↓
  クエリBの結果取得
    ↓
  画面のレンダリング開始 

・Async Datastore APIを使う

・Async Datastore APIを使う
  クエリAを非同期で実行(結果が返る前に次に進む)
    ↓
  クエリBを非同期で実行(結果が返る前に次に進む)
    ↓
    ↓  AとBの結果が返ってくるまで処理はブロックされる
    ↓
  クエリAの結果取得
    ↓  
  クエリBの結果取得
    ↓
  画面のレンダリング開始

例)

class Book(db.Model):
    name = db.StringProperty()    price = db.IntegerProperty()


class PCSoft(db.Model):
    name = db.StringProperty()
    price = db.IntegerProperty()


class PutHandler(webapp.RequestHandler):

    def get(self):
       b1 = Book(key_name="b_1",
                name="B_1",
                price=1000)
        b2 = Book(key_name="b_2",
                name="B_2",
                price=1200)
        p1 = PCSoft(key_name="p_1",
                name="P_1",
                price=5980)
        p2 = PCSoft(key_name="p_2",
                name="P_2",
                price=12800)
        b1_future = db.put_async(b1)
        b2_future = db.put_async(b2)
        p1_future = db.put_async(p1)
        p2_future = db.put_async(p2)
        logging.debug("b1_future: " + str(b1_future.get_result()))  # The get_result function returns a entity key object.
        logging.debug("b2_future: " + str(b2_future.get_result()))
        logging.debug("p1_future: " + str(p1_future.get_result()))
        logging.debug("p2_future: " + str(p2_future.get_result()))
        self.response.out.write("Some entities is saved asynchronously.")


class GetHandler(webapp.RequestHandler):

    def get(self):
        book_key = db.Key.from_path(Book.kind(), "b_1")
        book_future = db.get_async(book_key)
        query  = PCSoft.all().filter("price >=", 10000)
        pc_itr = query.run()
        logging.info("PC_ITE: " + str(pc_itr))
        book = book_future.get_result()
        self.response.out.write("Book: %s(¥%d)<br />" % (book.name, book.price))
        for pc in pc_itr:
            self.response.out.write("PC: %s(¥%d)<br />" % (pc.name, pc.price))

Result:

Book: B_1(¥1000)
PC: P_2(¥12800)

Async Datastore API (Python) - Google App Engine - Google Code

この記事が役に立った場合、シェアしていただけると励みになります!!