最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中終止協(xié)程和異常處理方式

 更新時(shí)間:2022年12月16日 16:16:26   作者:MZP_man  
這篇文章主要介紹了python中終止協(xié)程和異常處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

協(xié)程中未處理的異常會(huì)向上冒泡,傳給 next 函數(shù)或 send 方法的調(diào)用方(即觸發(fā)協(xié)程的對(duì) 象)。

下面示例舉例說明如何使用之前博客示例中由裝飾器定義的 averager 協(xié)程。

未處理的異常會(huì)導(dǎo)致協(xié)程終止

"""
預(yù)激協(xié)程的裝飾器

"""


from inspect import getgeneratorstate
from functools import wraps


def coroutine(func):
? ? """裝飾器:向前執(zhí)行到第一個(gè)`yield`表達(dá)式,預(yù)激`func`"""

? ? # 把被裝飾的生成器函數(shù)替換成這里的 primer 函數(shù);
? ? # 調(diào)用 primer 函數(shù)時(shí),返回預(yù)激后的 生成器。
? ? @wraps(func)
? ? def primer(*args, **kwargs):
? ? ? ? # 調(diào)用被裝飾的函數(shù),獲取生成器對(duì)象。
? ? ? ? gen = func(*args, **kwargs)
? ? ? ? # 預(yù)激生成器。
? ? ? ? next(gen)
? ? ? ? # 返回生成器。
? ? ? ? return gen

? ? return primer


@coroutine
def averager():
? ? total = 0.0
? ? count = 0
? ? average = None
? ? while True:
? ? ? ? term = yield average
? ? ? ? total += term
? ? ? ? count += 1
? ? ? ? average = total / count


if __name__ == '__main__':
? ? coro_avg = averager()
? ? # print(getgeneratorstate(coro_avg))
? ? print(coro_avg.send(10))
? ? print(coro_avg.send(30))
? ? # 發(fā)送的值不是數(shù)字,導(dǎo)致協(xié)程內(nèi)部有異常拋出。
? ? print(coro_avg.send('spam'))
? ? # 由于在協(xié)程內(nèi)沒有處理異常,協(xié)程會(huì)終止。
? ? # 如果試圖重新激活協(xié)程,會(huì)拋出 StopIteration 異常。
? ? print(coro_avg.send(60))

上面示例,暗示了終止協(xié)程的一種方式:發(fā)送某個(gè)哨符值,讓協(xié)程退出。內(nèi)置的 None 和 Ellipsis 等常量經(jīng)常用作哨符值。Ellipsis 的優(yōu)點(diǎn)是,數(shù)據(jù)流中不太常有這個(gè)值。我還見 過有人把 StopIteration 類(類本身,而不是實(shí)例,也不拋出)作為哨符值;也就是說, 是像這樣使用的:my_coro.send(StopIteration)。

從 Python 2.5 開始,客戶代碼可以在生成器對(duì)象上調(diào)用兩個(gè)方法,顯式地把異常發(fā)給協(xié)程。

這兩個(gè)方法是 throw 和 close。

generator.throw(exc_type[, exc_value[, traceback]])

致使生成器在暫停的 yield 表達(dá)式處拋出指定的異常。

如果生成器處理了拋出的異常,代碼會(huì)向前執(zhí)行到下一個(gè) yield 表達(dá)式,而產(chǎn)出的值會(huì)成為調(diào)用 generator.throw 方法 得到的返回值。

如果生成器沒有處理拋出的異常,異常會(huì)向上冒泡,傳到調(diào)用方的上下 文中。

generator.close()

致使生成器在暫停的yield 表達(dá)式處拋出GeneratorExit 異常。

如果生成器沒有處 理這個(gè)異常,或者拋出了StopIteration 異常(通常是指運(yùn)行到結(jié)尾),調(diào)用方不會(huì) 報(bào)錯(cuò)。

如果收到GeneratorExit 異常,生成器一定不能產(chǎn)出值,否則解釋器會(huì)拋出 RuntimeError 異常。

生成器拋出的其他異常會(huì)向上冒泡,傳給調(diào)用方。

下面舉例說明

如何使用 close 和 throw 方法控制協(xié)程:

"""
學(xué)習(xí)在協(xié)程中處理異常的測(cè)試代碼
"""
from inspect import getgeneratorstate

class DemoException(Exception):
? ? """為這次演示定義的異常類型。"""

def demo_exc_handling():
? ? print('-> coroutine started')
? ? try:
? ? ? ? while True:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? x = yield
? ? ? ? ? ? # ?特別處理 DemoException 異常
? ? ? ? ? ? except DemoException:
? ? ? ? ? ? ? ? print('*** DemoException handled. Continuing...')
? ? ? ? ? ? # 如果沒有異常,那么顯示接收到的值。
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('-> coroutine received: {!r}'.format(x))
? ? finally:
? ? ? ? # 如果不管協(xié)程如何結(jié)束都想做些清理工作,
? ? ? ? # 要把協(xié)程定義體中相關(guān)的代碼放入try/ finally 塊中
? ? ? ? print('-> coroutine ending')

if __name__ == '__main__':
? ? exc_coro = demo_exc_handling()
? ? next(exc_coro)
? ? exc_coro.send(11)
? ? exc_coro.send(22)
? ? # 激活和關(guān)閉 demo_exc_handling,沒有異常
? ? # exc_coro.close()

? ? # 如果把 DemoException 異常傳入 demo_exc_handling 協(xié)程,
? ? # 它會(huì)處理,然后繼續(xù)運(yùn)行
? ? # exc_coro.throw(DemoException)
? ? # exc_coro.send(33)

? ? # 如果無法處理傳入的異常,協(xié)程會(huì)終止
? ? exc_coro.throw(ZeroDivisionError)

? ? print(getgeneratorstate(exc_coro))

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyQt5中QCommandLinkButton的詳細(xì)教程與應(yīng)用實(shí)戰(zhàn)

    PyQt5中QCommandLinkButton的詳細(xì)教程與應(yīng)用實(shí)戰(zhàn)

    在PyQt5中,QCommandLinkButton是一個(gè)特殊的按鈕控件,它最初在Windows Vista中引入,并因其獨(dú)特的外觀和功能在GUI應(yīng)用程序中得到了廣泛應(yīng)用,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹QCommandLinkButton在PyQt5中的用法,需要的朋友可以參考下
    2024-07-07
  • Django實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    Django實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python之變量類型和if判斷方式

    Python之變量類型和if判斷方式

    這篇文章主要介紹了Python之變量類型和if判斷方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python基于OpenCV實(shí)現(xiàn)視頻的人臉檢測(cè)

    Python基于OpenCV實(shí)現(xiàn)視頻的人臉檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Python基于OpenCV實(shí)現(xiàn)視頻的人臉檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • python socket實(shí)現(xiàn)聊天室

    python socket實(shí)現(xiàn)聊天室

    這篇文章主要為大家詳細(xì)介紹了python socket實(shí)現(xiàn)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • opencv實(shí)現(xiàn)圖像縮放效果

    opencv實(shí)現(xiàn)圖像縮放效果

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖像縮放效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例

    pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例

    本文主要介紹了pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • python繪制春節(jié)煙花的示例代碼

    python繪制春節(jié)煙花的示例代碼

    這篇文章主要介紹了使用python 實(shí)現(xiàn)的簡(jiǎn)單春節(jié)煙花效果的示例代碼,請(qǐng)注意,運(yùn)行本文的代碼之前,請(qǐng)確保計(jì)算機(jī)上已經(jīng)安裝了Pygame庫(kù),需要的朋友可以參考下
    2024-02-02
  • Python常用字符串替換函數(shù)strip、replace及sub用法示例

    Python常用字符串替換函數(shù)strip、replace及sub用法示例

    這篇文章主要介紹了Python常用字符串替換函數(shù)strip、replace及sub用法,結(jié)合實(shí)例形式分析了Python針對(duì)字符串替換的常用函數(shù)strip、replace及sub功能及簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2018-05-05
  • python中路徑的三種寫法+路徑前符號(hào)含義解讀

    python中路徑的三種寫法+路徑前符號(hào)含義解讀

    這篇文章主要介紹了python中路徑的三種寫法+路徑前符號(hào)含義解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

玛沁县| 红安县| 黄山市| 禹州市| 馆陶县| 会同县| 白朗县| 德清县| 阳高县| 桐乡市| 丽水市| 区。| 永春县| 南投市| 庆云县| 邳州市| 广丰县| 杨浦区| 句容市| 渑池县| 安泽县| 兴业县| 张家港市| 姜堰市| 措勤县| 射阳县| 清镇市| 龙游县| 田阳县| 佛学| 镇安县| 深水埗区| 赞皇县| 奉节县| 凉城县| 汤阴县| 紫金县| SHOW| 奈曼旗| 西峡县| 安岳县|