簡體   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