12

私は、ndbコードベースを可能な限り非同期に移行する過程にあります。どうすればよいかわからないシナリオがあります:トランザクション。

私が見ているように、私には3つのオプションがあります。

オプション1:ndb.transaction()同期的に呼び出し、トランザクションの関数に非同期メソッドを呼び出させます。

def option_1():
    @ndb.tasklet
    def txn():
        e = yield Foo.get_by_id_async(some_id)
        if e is None:
            e = yield Foo().put_async()
        raise ndb.Return(e)

    # The doc for ndb.transaction() says that it takes a function or tasklet.
    # If it's a tasklet, does it wait on the Future that is returned?
    # If it doesn't wait, what is the proper way to call a tasklet in a transaction
    # and get access to its return value?
    return ndb.transaction(txn)

オプション2:ndb.transaction()非同期で呼び出し、トランザクションの関数にsyncメソッドを呼び出させます。

@ndb.toplevel
def option_2():
    def txn():
        e = Foo.get_by_id(some_id)
        if e is None:
            e = Foo().put()
        return e

    result = yield ndb.transaction_async(txn)
    return result

オプション3:ndb.transaction()非同期で呼び出し、トランザクションの関数に非同期メソッドを呼び出させます。

@ndb.toplevel
def option_3():
    @ndb.tasklet
    def txn():
        e = yield Foo.get_by_id_async(some_id)
        if e is None:
            e = yield Foo().put_async()
        raise ndb.Return(e)

    result = yield ndb.transaction_async(txn)
    return result

オプション3が行くべきもののように感じますが、私はむしろ専門家の意見/アドバイスに頼りたいです...

4

1 に答える 1

9

ええ、#3は間違いなく行く方法です。他の2つには、非同期コードと同期コードが混在しているという問題があります。これは、アプリの最上位レベルを除いて、一般的には適切ではありません。

PS。実際、タスクレットの場合、トランザクションはコールバックを待機します。

于 2013-02-12T17:18:36.127 に答える