作为 Python 的新手,我发现 yield 和 generators 以及 async 函数非常压倒性(我已经阅读了关于该主题的所有 SO 问题和其他几个不同的参考资料 - 仍然很难连接所有部分)。我已经习惯了 Objective-C 的描述性语法,所有的东西都只是告诉你它在做什么,而不是试图连接所有你不知道的不同关键字的片段,这些关键字真的不知道它们如何协同工作。
我真的很喜欢 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 一词,在您对该词的典型用法中,它的意思是“如有必要,让其他事情做其他事情”,我看到了 async 这个词,这意味着异步。所以我想出了异步方法的 yield + async = 神奇公式,但显然情况并非如此?