91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺析python協程相關概念

發布時間:2020-10-03 20:38:10 來源:腳本之家 閱讀:160 作者:laozhang 欄目:開發技術

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

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

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

 

# 生成器表達式
a = (x*x for x in range(10))
# next生成值
next(a()) # 輸出0
next(a()) # 輸出1
next(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:
      pass
w = 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'

不用于異步的協程該怎么用,我還不知道。所以,協程的介紹到這里就結束啦。感謝你對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岐山县| 娄烦县| 农安县| 阿瓦提县| 敖汉旗| 锡林郭勒盟| 广丰县| 龙州县| 唐河县| 桐城市| 杭州市| 襄汾县| 昭平县| 兰考县| 安化县| 方城县| 当雄县| 分宜县| 八宿县| 巍山| 望都县| 长兴县| 萍乡市| 公安县| 来安县| 洞头县| 嘉定区| 塔河县| 长丰县| 那曲县| 郑州市| 鄂托克前旗| 乐清市| 广宗县| 民丰县| 淅川县| 平谷区| 平乐县| 齐齐哈尔市| 嘉禾县| 平泉县|