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 =非同期メソッドの魔法の公式を考えましたが、どうやらそうではありませんか?