2

Pythonの初心者として、yieldとジェネレーター、および非同期関数が非常に圧倒されていることに気付きました(トピックに関するすべてのSOの質問と、他のいくつかのさまざまなリファレンスを読みましたが、まだすべての部分を接続するのに苦労しています)。私はObjective-Cの記述構文に慣れています。ここでは、実際にはどのように連携するかわからない個別のキーワードをすべて接続しようとするのではなく、すべてが何をしているのかを示します。

少なくとも基本的なことについては、Pythonを簡単に理解できるので、私はPythonが本当に好きでした。しかし、より高度なことについては、コードはあなたに話しかけません。それが何をしているのかはわかりません。(多分私は少しイライラしていて経験が浅いです。)

とにかく、私は次の関数を完全に非同期にしたいです:

@ndb.tasklet
def get_new_statues(friends):
    status_list = list()
    for friend_dic in friends:
        lastStatusDate = #some date
        userKey = #some key
        query = ndb.gql('SELECT * FROM Statuses WHERE ANCESTOR IS :1 AND date > :2', userKey, lastStatusDate)
        qit = query.iter()
        while (yield qit.has_next_async()):
            status = qit.next()
            status_list.append(status.to_dict())
    raise ndb.Return(status_list)

これを書いたとき、私は少し感銘を受けました。そして、ほんの数時間ですべてのコードを非同期に変換できたことに興奮しました。しかし、上記の関数はまったく非同期ではないと言われています。しかし、別の質問で、はい、私がしていることは正しいと言われています。

では、正確には何が起こっているのでしょうか?ここでのyieldステートメントは私のコードを同期させますか?これを非同期に変更するにはどうすればよいですか?

(私が尋ねた質問はすべて似ているように見えますが、問題は、説明ではなく回答としてより多くのコードが返されることです。私は、コードの意味を理解するのに役立つ単語を探している人間です。より多くのコードを理解するのに役立つより多くのコードを探しているマシン。誰もが私に方法や内容を教えているだけで、誰も私に理由を教えてくれません。)

補遺:私を最も驚かせているのは次のとおりです。while (yield qit.has_next_async()):人間の読者として、私はyieldという単語を読みます。これは、通常の使用法では「必要に応じて他の何かを実行させる」という意味で、非同期という単語が表示されます。 、これは非同期を意味します。だから私はyield+async =非同期メソッドの魔法の公式を考えましたが、どうやらそうではありませんか?

4

1 に答える 1

1

歩留まりが何をするのか理解していないようですね。

これは完全に正確ではないかもしれませんが、一般に「yield」は「return」のように考えることができます。ただし、この関数を再度呼び出すと、関数の先頭ではなく、最後に生成された場所から実行を継続します。

qit.has_next_async()は非同期であるため、この関数は非同期です。この関数を呼び出すたびに、qit.has_next_function()の値が返され、次のエンティティが取得されます。完了すると、結果とともに例外が発生します。

于 2012-08-28T21:15:29.757 に答える