淺析python協程相關概念,淺析python協程

來源:互聯網
上載者:User

淺析python協程相關概念,淺析python協程

這篇文章是讀者朋友的python協程的學習經驗之談,以下是全部內容:

協程的曆史說來話長,要從產生器開始講起。

如果你看過我之前的文章python奇遇記:迭代器和產生器 ,對產生器的概念應該很瞭解。產生器節省記憶體,用的時候才產生結果。

 

# 產生器運算式a = (x*x for x in range(10))# next產生值next(a()) # 輸出0next(a()) # 輸出1next(a()) # 輸出4

與產生器產出資料不同的是,協程在產出資料的同時還可以接收資料,具體來說就是把yield 放在了運算式的右邊。我們可以使用.send() 把資料發送給協程函數。

 def writer():  print('-> coroutine started')  for i in range(8):    w = yield    print(i+w)w = writer()# 本質還是產生器>>> w<generator object writer at 0x000002595BC57468># 首先要用next()把協程啟用>>> next(w)-> coroutine started# 發送資料>>> w.send(1)1# send到第八次之後會拋出異常# 因為協程已經結束了---------------------------------------------------------------------------StopIteration               Traceback (most recent call last)

第一步必須使用next() 啟用協程函數,這樣才能在下一步使用.send() 發送資料。

可以看到,在第8次接收完資料之後,會產生結束的異常,因為程式流程結束了,這是正常現象。加個異常處理即可。如果需要在兩個協程間傳遞資料呢?

def writer():  while True:    w = yield    print('>>', w)def writer_wrapper(coro):  # 啟用  next(coro)  while True:    # 異常處理    try:      x = yield      # 發送資料給writer      coro.send(x)    except StopIteration:      passw = writer()wrap = writer_wrapper(w)# 啟用next(wrap)for i in range(4):  wrap.send(i)# 輸出>> 0>> 1>> 2>> 3

上面的代碼中,資料首先傳遞到writer_wrapper,之後再傳遞到writer 。

data——>writer_wrapper——>writer

可以這麼寫,不過,又要預先啟用,又要加異常,看起來有點麻煩啊。yield from 的出現可以解決這個問題,同樣是傳遞資料:

def writer():  while True:    w = yield    print('>>', w)def writer_wrapper2(coro):  yield from coro

一行代碼解決問題。

總之,yield from相當於提供了一個通道,使得資料可以在協程之間流轉 。writer_wrapper2 中使用yield from coro時,coro此時獲得控制權,在我們.send() 資料時,writer_wrapper2 被阻塞,直到writer 列印出結果。

在這個階段,協程本質上還是由產生器構成的。

即使我們使用yield from 簡化了流程,協程和產生器的知識理解起來還是有點懵逼,而且yield from 用在非同步編程中有諸多不順(asyncio以前就是用yield from),於是在3.5版本的python中,棄用了yield from ,新加入了兩個關鍵字async 和await ,同時協程不再是產生器類型,而是原生的協程類型。

現在我們定義一個協程要像下面這樣:

async def func():  await 'some code'

不用於非同步協程該怎麼用,我還不知道。所以,協程的介紹到這裡就結束啦。感謝你對幫客之家的支援。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.