成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

python協(xié)程的前世今生

stackfing / 1525人閱讀

摘要:協(xié)程的歷史說來話長,要從生成器開始講起。我們可以使用把數(shù)據(jù)發(fā)送給協(xié)程函數(shù)??梢钥吹?,在第次接收完數(shù)據(jù)之后,會產(chǎn)生結(jié)束的異常,因?yàn)槌绦蛄鞒探Y(jié)束了,這是正?,F(xiàn)象。在這個(gè)階段,協(xié)程本質(zhì)上還是由生成器構(gòu)成的。所以,協(xié)程的介紹到這里就結(jié)束啦。

在上一篇對python并發(fā)編程的理解 中,我簡單提到了協(xié)程的概念,有一個(gè)錯(cuò)誤需要指出的是,asyncio不全是對協(xié)程的實(shí)現(xiàn),只是用到了協(xié)程。

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

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

# 生成器表達(dá)式
a = (x*x for x in range(10))

# next生成值
next(a()) # 輸出0
next(a()) # 輸出1
next(a()) # 輸出4

與生成器產(chǎn)出數(shù)據(jù)不同的是,協(xié)程在產(chǎn)出數(shù)據(jù)的同時(shí)還可以接收數(shù)據(jù),具體來說就是把yield 放在了表達(dá)式的右邊。我們可以使用.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

# 首先要用next()把協(xié)程激活
>>> next(w)
-> coroutine started
# 發(fā)送數(shù)據(jù)
>>> w.send(1)
1
# send到第八次之后會拋出異常
# 因?yàn)閰f(xié)程已經(jīng)結(jié)束了
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)

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

可以看到,在第8次接收完數(shù)據(jù)之后,會產(chǎn)生結(jié)束的異常,因?yàn)槌绦蛄鞒探Y(jié)束了,這是正常現(xiàn)象。加個(gè)異常處理即可。如果需要在兩個(gè)協(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:
            pass
w = 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ù)先激活,又要加異常,看起來有點(diǎn)麻煩啊。yield from 的出現(xiàn)可以解決這個(gè)問題,同樣是傳遞數(shù)據(jù):

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

一行代碼解決問題。

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

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

but,

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

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

async def func():
    await "some code"

不用于異步的協(xié)程該怎么用,我還不知道。所以,協(xié)程的介紹到這里就結(jié)束啦。


本人才疏學(xué)淺,上文中難免有些錯(cuò)誤,還請各位品評指正。如果覺得寫的還行,歡迎關(guān)注我的公眾號MLGroup,講解python和機(jī)器學(xué)習(xí)方面的知識。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/41264.html

相關(guān)文章

  • 聊聊 print 的前世今生

    摘要:反對的意見主要是這樣可能會破壞掉無數(shù)個(gè)腳本,而且中已經(jīng)有太多的魔法了。除此之外,的命名本身也算是一種包袱。首字母大寫的,譯作史努比,則是一只被很多人喜愛的漫畫小狗。 showImg(https://segmentfault.com/img/remote/1460000019559250); 本文原創(chuàng)并首發(fā)于公眾號【Python貓】,未經(jīng)授權(quán),請勿轉(zhuǎn)載。 原文地址:https://mp....

    stackvoid 評論0 收藏0
  • Python協(xié)程(真才實(shí)學(xué),想學(xué)的進(jìn)來)

    摘要:所以與多線程相比,線程的數(shù)量越多,協(xié)程性能的優(yōu)勢越明顯。值得一提的是,在此過程中,只有一個(gè)線程在執(zhí)行,因此這與多線程的概念是不一樣的。 真正有知識的人的成長過程,就像麥穗的成長過程:麥穗空的時(shí)候,麥子長得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時(shí),它們開始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關(guān)于python多線程是否是雞肋的問題,得到了一些網(wǎng)友的認(rèn)可,當(dāng)然也有...

    lykops 評論0 收藏0
  • python協(xié)程與golang協(xié)程的區(qū)別

    摘要:進(jìn)程線程和協(xié)程進(jìn)程的定義進(jìn)程,是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。協(xié)程和線程的關(guān)系協(xié)程是在語言層面實(shí)現(xiàn)對線程的調(diào)度,避免了內(nèi)核級別的上下文消耗。和都引入了消息調(diào)度系統(tǒng)模型,來避免鎖的影響和進(jìn)程線程開銷大的問題。 進(jìn)程、線程和協(xié)程 進(jìn)程的定義: 進(jìn)程,是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序的真正運(yùn)行實(shí)例。 線程的定義: 操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單...

    csRyan 評論0 收藏0
  • PyTips 0x13 - Python 線程與協(xié)程(2)

    摘要:項(xiàng)目地址我之前翻譯了協(xié)程原理這篇文章之后嘗試用了模式下的協(xié)程進(jìn)行異步開發(fā),確實(shí)感受到協(xié)程所帶來的好處至少是語法上的。 項(xiàng)目地址:https://git.io/pytips 我之前翻譯了Python 3.5 協(xié)程原理這篇文章之后嘗試用了 Tornado + Motor 模式下的協(xié)程進(jìn)行異步開發(fā),確實(shí)感受到協(xié)程所帶來的好處(至少是語法上的:D)。至于協(xié)程的 async/await 語法是如...

    史占廣 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<