国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺析python協(xié)程相關(guān)概念

2020-01-04 16:10:54
字體:
供稿:網(wǎng)友

這篇文章是讀者朋友的python協(xié)程的學(xué)習(xí)經(jīng)驗之談,以下是全部內(nèi)容:

協(xié)程的歷史說來話長,要從生成器開始講起。

如果你看過我之前的文章python奇遇記:迭代器和生成器 ,對生成器的概念應(yīng)該很了解。生成器節(jié)省內(nèi)存,用的時候才生成結(jié)果。

 

# 生成器表達式a = (x*x for x in range(10))# next生成值next(a()) # 輸出0next(a()) # 輸出1next(a()) # 輸出4

 

與生成器產(chǎn)出數(shù)據(jù)不同的是,協(xié)程在產(chǎn)出數(shù)據(jù)的同時還可以接收數(shù)據(jù),具體來說就是把yield 放在了表達式的右邊。我們可以使用.send() 把數(shù)據(jù)發(fā)送給協(xié)程函數(shù)。

 def writer():  print('-> coroutine started')  for i in range(8):    w = yield    print(i+w)w = writer()# 本質(zhì)還是生成器>>> w<generator object writer at 0x000002595BC57468># 首先要用next()把協(xié)程激活>>> next(w)-> coroutine started# 發(fā)送數(shù)據(jù)>>> w.send(1)1# send到第八次之后會拋出異常# 因為協(xié)程已經(jīng)結(jié)束了---------------------------------------------------------------------------StopIteration               Traceback (most recent call last)

第一步必須使用next() 激活協(xié)程函數(shù),這樣才能在下一步使用.send() 發(fā)送數(shù)據(jù)。

可以看到,在第8次接收完數(shù)據(jù)之后,會產(chǎn)生結(jié)束的異常,因為程序流程結(jié)束了,這是正常現(xiàn)象。加個異常處理即可。如果需要在兩個協(xié)程間傳遞數(shù)據(jù)呢?

def writer():  while True:    w = yield    print('>>', w)def writer_wrapper(coro):  # 激活  next(coro)  while True:    # 異常處理    try:      x = yield      # 發(fā)送數(shù)據(jù)給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

上面的代碼中,數(shù)據(jù)首先傳遞到writer_wrapper,之后再傳遞到writer 。

data——>writer_wrapper——>writer

可以這么寫,不過,又要預(yù)先激活,又要加異常,看起來有點麻煩啊。yield from 的出現(xiàn)可以解決這個問題,同樣是傳遞數(shù)據(jù):

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

一行代碼解決問題。

總之,yield from相當(dāng)于提供了一個通道,使得數(shù)據(jù)可以在協(xié)程之間流轉(zhuǎn) 。writer_wrapper2 中使用yield from coro時,coro此時獲得控制權(quán),在我們.send() 數(shù)據(jù)時,writer_wrapper2 被阻塞,直到writer 打印出結(jié)果。

在這個階段,協(xié)程本質(zhì)上還是由生成器構(gòu)成的。

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

現(xiàn)在我們定義一個協(xié)程要像下面這樣:

async def func():  await 'some code'

不用于異步的協(xié)程該怎么用,我還不知道。所以,協(xié)程的介紹到這里就結(jié)束啦。感謝你對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐乡市| 韩城市| 大方县| 苏州市| 遂昌县| 滦南县| 安西县| 巢湖市| 曲水县| 深泽县| 铁岭县| 尉犁县| 石阡县| 沁源县| 灯塔市| 仙桃市| 金昌市| 沅江市| 右玉县| 广水市| 昌平区| 微山县| 明星| 惠东县| 迭部县| 太和县| 天祝| 山东| 特克斯县| 阜新| 北安市| 星子县| 宁国市| 虹口区| 澜沧| 揭西县| 乐昌市| 罗甸县| 确山县| 郴州市| 郴州市|