如何使这个Python函数异步?

时间:2012-08-28 14:26:09

标签: python google-app-engine

作为Python的新手,我发现产量和生成器以及异步函数极其庞大(我已经阅读了有关主题和其他几个参考文献的所有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)

当我写这篇文章时,我对自己印象深刻,并且很兴奋我能够在几个小时内将所有代码转换为异步。但是I'm being told上面的函数根本不是异步的。但后来in another question我被告知是的,我正在做的是正确的。

那到底是怎么回事?这里的yield语句是否使我的代码同步?我如何修改它以使其异步?

(我问过的问题似乎都很相似,但问题是我得到的代码更多的是答案而不是解释。我是一个人在寻找可以帮助我理解代码的词汇,而不是寻找更多代码的机器来帮助我理解更多代码。每个人都只是告诉我如何或什么,没有人告诉我为什么。)

附录:我想最让我失望的是:while (yield qit.has_next_async()):作为一名人类读者,我读到了“yield”这个词,在你的典型用法中意为“如果有必要,让其他东西做别的事情“我看到async这个词,这意味着异步。所以我认为yield + async =一个异步方法的神奇公式,但显然情况并非如此?

1 个答案:

答案 0 :(得分:1)

听起来你不明白收益率是多少。

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

由于qit.has_next_async()是异步的,因此该函数是异步的。每次调用此函数时,它都会返回qit.has_next_function()的值,然后它将获得下一个实体。当它完成时,它会引发结果异常。