2

作为 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 = 神奇公式,但显然情况并非如此?

4

1 回答 1

1

听起来你不明白 yield 的作用。

虽然这可能不完全准确,但您通常可以将“yield”视为“return”,除非您再次调用此函数,它会从上次产生的位置继续运行,而不是函数的开头。

由于 qit.has_next_async() 是异步的,所以这个函数是异步的。每次调用这个函数,它都会返回qit.has_next_function() 的值,并获取下一个实体。完成后,结果会引发异常。

于 2012-08-28T21:15:29.757 回答