欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3.10?Generator生成器Coroutine原生協(xié)程詳解

 更新時間:2022年12月28日 09:04:47   作者:劉悅的技術博客  
這篇文章主要為大家介紹了Python3.10?Generator生成器Coroutine原生協(xié)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

普遍意義上講,生成器是一種特殊的迭代器,它可以在執(zhí)行過程中暫停并在恢復執(zhí)行時保留它的狀態(tài)。而協(xié)程,則可以讓一個函數(shù)在執(zhí)行過程中暫停并在恢復執(zhí)行時保留它的狀態(tài),在Python3.10中,原生協(xié)程的實現(xiàn)手段,就是生成器,或者說的更具體一些:協(xié)程就是一種特殊的生成器,而生成器,就是協(xié)程的入門心法。

協(xié)程底層實現(xiàn)

我們知道,Python3.10中可以使用async和await關鍵字來實現(xiàn)原生協(xié)程函數(shù)的定義和調(diào)度,但其實,我們也可以利用生成器達到協(xié)程的效果,生成器函數(shù)和普通函數(shù)的區(qū)別在于,生成器函數(shù)使用 yield 語句來暫停執(zhí)行并返回結果。例如,下面是一個使用生成器函數(shù)實現(xiàn)的簡單協(xié)程:

def my_coroutine():  
    while True:  
        x = yield  
        print(x)  
# 使用生成器函數(shù)創(chuàng)建協(xié)程  
coroutine = my_coroutine()  
# 啟動協(xié)程  
next(coroutine)  
# 在協(xié)程中傳入數(shù)據(jù)  
coroutine.send(1)  
coroutine.send(2)  
coroutine.send(3)

程序返回:

?  mydemo git:(master) ? /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/mydemo/src/test.py"  
1  
2  
3

在上面的代碼中,生成器函數(shù) my_coroutine 使用了一個無限循環(huán)來實現(xiàn)協(xié)程的邏輯。每當調(diào)用 send 方法時,協(xié)程就會從 yield 語句處恢復執(zhí)行,并將傳入的參數(shù)賦值給變量 x。

如此,就完成了協(xié)程執(zhí)行-》阻塞-》切換-》回調(diào)的工作流模式。

當然,作為事件循環(huán)機制,協(xié)程服務啟動可能無限期地運行,要關閉協(xié)程服務,可以使用生成器的close()方法。當一個協(xié)程被關閉時,它會生成GeneratorExit異常,該異常可以用生成器的方式進行捕獲:

def my_coroutine():  
    try :  
        while True:  
            x = yield  
            print(x)  
    except GeneratorExit:  
            print("協(xié)程關閉")  
# 使用生成器函數(shù)創(chuàng)建協(xié)程  
coroutine = my_coroutine()  
# 啟動協(xié)程  
next(coroutine)  
# 在協(xié)程中傳入數(shù)據(jù)  
coroutine.send(1)  
coroutine.send(2)  
coroutine.send(3)  
coroutine.close()

程序返回:

?  mydemo git:(master) ? /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/mydemo/src/test.py"  
1  
2  
3  
協(xié)程關閉

業(yè)務場景

在實際業(yè)務場景中,我們也可以使用生成器來模擬協(xié)程流程,主要體現(xiàn)在數(shù)據(jù)的IO流操作中,假設我們需要從本地往服務器傳輸數(shù)據(jù),首先建立鏈接對象:

class Connection:  
    def __init__(self, addr):  
        self.addr = addr  
    def transmit(self, data):  
        print(f"X: {data[0]}, Y: {data[1]} sent to {self.addr}")

隨后建立生成器函數(shù):

def send_to_server(conn):  
    while True:  
        try:  
            raw_data = yield  
            raw_data = raw_data.split(' ')  
            coords = (float(raw_data[0]), float(raw_data[1]))  
            conn.transmit(coords)  
        except ConnectionError:  
            print("鏈接丟失,進行回調(diào)")  
            conn = Connection("重新連接v3u.cn")

利用生成器調(diào)用鏈接類的transmit方法進行數(shù)據(jù)的模擬傳輸,如果鏈接斷開,則會觸發(fā)回調(diào)重新連接,執(zhí)行邏輯:

if __name__ == '__main__':  
    conn = Connection("v3u.cn")  
    sender = send_to_server(conn)  
    sender.send(None)  
    for i in range(1, 6):  
        sender.send(f"{100/i} {200/i}")  
    # 模擬鏈接斷開  
    conn.addr = None  
    sender.throw(ConnectionError)   
    for i in range(1, 6):  
        sender.send(f"{100/i} {200/i}")

程序返回:

X: 100.0, Y: 200.0 sent to v3u.cn  
X: 50.0, Y: 100.0 sent to v3u.cn  
X: 33.333333333333336, Y: 66.66666666666667 sent to v3u.cn  
X: 25.0, Y: 50.0 sent to v3u.cn  
X: 20.0, Y: 40.0 sent to v3u.cn  
鏈接丟失,進行回調(diào)  
X: 100.0, Y: 200.0 sent to 重新連接v3u.cn  
X: 50.0, Y: 100.0 sent to 重新連接v3u.cn  
X: 33.333333333333336, Y: 66.66666666666667 sent to 重新連接v3u.cn  
X: 25.0, Y: 50.0 sent to 重新連接v3u.cn  
X: 20.0, Y: 40.0 sent to 重新連接v3u.cn

如此,我們就可以利用生成器的“狀態(tài)保留”機制來控制網(wǎng)絡鏈接突然斷開的回調(diào)補救措施了。

所以說,協(xié)程就是一種特殊的生成器:

async def test():  
    pass  
print(type(test())) 

您猜怎么著?

<class 'coroutine'>

結語

誠然,生成器和協(xié)程也并非完全是一個概念,與生成器不同的是,協(xié)程可以被另一個函數(shù)(稱為調(diào)用方)恢復執(zhí)行,而不是只能由生成器本身恢復執(zhí)行。這使得協(xié)程可以用來實現(xiàn)更復雜的控制流,因為它們可以在執(zhí)行時暫停并在任意時刻恢復執(zhí)行。

以上就是Python3.10 Generator生成器Coroutine原生協(xié)程詳解的詳細內(nèi)容,更多關于Python生成器原生協(xié)程的資料請關注腳本之家其它相關文章!

相關文章

  • python更換國內(nèi)鏡像源三種實用方法

    python更換國內(nèi)鏡像源三種實用方法

    這篇文章主要給大家介紹了關于python更換國內(nèi)鏡像源三種實用方法的相關資料,更換Python鏡像源可以幫助解決使用pip安裝包時速度過慢或無法連接的問題,需要的朋友可以參考下
    2023-09-09
  • 深入解析Python中的lambda表達式的用法

    深入解析Python中的lambda表達式的用法

    這篇文章主要介紹了深入解析Python中的lambda表達式的用法,包括其與def之間的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • python實現(xiàn)帶聲音的摩斯碼翻譯實現(xiàn)方法

    python實現(xiàn)帶聲音的摩斯碼翻譯實現(xiàn)方法

    這篇文章主要介紹了python實現(xiàn)帶聲音的摩斯碼翻譯實現(xiàn)方法,涉及pygame模塊操作及摩斯碼實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池

    Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池

    這篇文章主要介紹了Python 中創(chuàng)建 PostgreSQL 數(shù)據(jù)庫連接池,Python 連接 PostgreSQL 是主要有兩個包, py-postgresql 和 psycopg2 , 而本文的實例將使用后者,感興趣的小伙伴可以參考一下
    2021-10-10
  • Python用類實現(xiàn)撲克牌發(fā)牌的示例代碼

    Python用類實現(xiàn)撲克牌發(fā)牌的示例代碼

    這篇文章主要介紹了Python用類實現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • python爬蟲要用到的庫總結

    python爬蟲要用到的庫總結

    在本篇內(nèi)容中小編給大家整理的是關于python爬蟲要用到的庫總結內(nèi)容,需要的朋友們可以學習下。
    2020-07-07
  • 用Python解析身份證號獲取年齡和性別的實現(xiàn)方法

    用Python解析身份證號獲取年齡和性別的實現(xiàn)方法

    身份證號碼包含了豐富的信息,包括生日和性別,Python提供了處理和解析身份證號的功能,讓我們能夠從中提取出相關的信息,本文將介紹如何利用Python解析身份證號,獲取持有者的年齡和性別信息,感興趣的朋友可以參考下
    2023-12-12
  • 對于Python深淺拷貝的理解

    對于Python深淺拷貝的理解

    這篇文章主要介紹了對于Python深淺拷貝的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python常見異常分類與處理方法

    Python常見異常分類與處理方法

    之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,所以決定再整理一篇,算做補充。
    2017-06-06
  • Python語法中的模糊語義

    Python語法中的模糊語義

    這篇文章主要介紹的是Python語法中的模糊語義,下面文章具體內(nèi)容包括切片不執(zhí)行越界檢查和報錯、空列表的創(chuàng)建、閉包的延遲綁定,需要的朋友可以參考一下
    2021-11-11

最新評論