繁体   English   中英

如何使此Python函数异步?

[英]How do I make this Python function asynchronous?

作为Python的新手,我发现yields和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这个词,也就意味着async。 所以我想出了异步方法的yield + async =神奇公式,但是显然不是这样吗?

听起来您似乎不了解产量。

尽管这可能并不完全准确,但是通常可以将“收益”视为“返回”,除非再次调用此函数时,它将从最后产生的地方继续运行,而不是从函数的开头开始。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM