2017-10-19 136 views
0

似乎有出現兩種的發電的協程:這兩種基於生成器的協同程序是相同的概念嗎?

  1. a reply 由吉姆Fasarakis希利亞德:

    的發電的協程:一個發電機(def + yield),該被types.coroutine包裹。如果需要將它視爲協程對象,則需要將其包裝在 types.coroutine中。

  2. 通過Python果殼中,不顯式調用 「基於生成器的協同程序」:

    當你寫一個基於asyncio(理想情況下還使用 Python代碼插件來自asyncio.org的模塊),你通常會編寫協同函數 。包括Python 3.4在內,這些函數 是使用第95頁上的「產量 (僅限v3-only)」中所述的yield from語句生成的生成器,使用第518頁上的「asyncio協同程序」中涵蓋的@asyncio.coroutine, 修飾;

    https://www.python.org/dev/peps/pep-0492/#differences-from-generators

    發電的協同程序(用於ASYNCIO代碼必須與@ asyncio.coroutine裝飾)

    http://masnun.com/2015/11/13/python-generators-coroutines-native-coroutines-and-async-await.html 也將其稱爲 「基於生成器的協同程序」。

這兩種基於生成器的協程是相同的概念嗎?

如果不是,他們在目的和用途上有何分別?

謝謝。

回答

2

它們是同類的協程。types.coroutineasyncio.coroutine是創建它們的兩種獨立方式。

asyncio.coroutine比較老,早於引入了async協同程序,其功能已經從原來的行爲轉移了一些,現在已經存在async協程。

asyncio.coroutinetypes.coroutine有微妙的不同的行爲,特別是應用到除了發電機功能的其他任何東西,或者如果ASYNCIO是debug mode

1

就我而言,async def正確的方式來定義協程。 yieldyield from在發生器中有其用途,它們也用於實現「期貨」,這是處理不同協同環境之間切換的低級機制。我在幾個月前做過this diagram來總結他們之間的關係。但坦率地說,你可以放心地忽略整個業務。事件循環具有處理管理協程執行的所有低級細節的工作,因此使用其中的一個,如asyncio。對於其他事件循環,還有asyncio兼容包裝,就像我自己的GLOB/GTK的glibcoro一樣。

換句話說,堅持asyncio API,你可以編寫「事件循環不可知」協程!

相關問題