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

Python中協程coroutine適用場景分析

 更新時間:2024年04月10日 09:38:59   作者:嗨學編程  
多線程中可能出現多個線程爭搶變量,所以變量需要加鎖;協程中任一時刻都只有一個線程,所以變量不需要加鎖,這篇文章主要介紹了Python中協程(coroutine)詳解,需要的朋友可以參考下

一、協程和線程的比較及其適用場景

1 共用變量問題

多線程中可能出現多個線程爭搶變量,所以變量需要加鎖;協程中任一時刻都只有一個線程,所以變量不需要加鎖。

但是協程雖然不像多線程爭搶變量但仍是和多線程一樣共用變量的,即共用變量在某處改變在另外一處引用時也會發(fā)生改變。

2 協程的適用場景

從資源角度說,協程只有一個線程只能使用一個cpu核,所以它適合用于IO密集(包括磁盤IO和網絡IO)函數,并不適用于計算密集函數。

從事情重復性說,協程類似多線程,適用于被反復調用的函數(for或while),也可用于做不同事情的多個函數。

3 協程的切換

線程是由操作系統(tǒng)來控制切換的,并不需要我們自己來調度;但協程在操作系統(tǒng)中表現為一個線程,其調度操作系統(tǒng)無能為力,只得我們自己來實現。

await關鍵字表示該位置阻塞時可讓出cpu執(zhí)行,即切換到下一協程運行;但追根究底對我們而言好像只有await asyncio.sleep()(另外還有future但這個暫不考慮吧)。

所以各協程間一定要在某個地方(尤其是循環(huán)內)使用await asyncio.sleep()謙讓給其他協程,不然如果協程一直不謙讓那其他協程,那其他協程只能等該協程運行完才能運行了。

二、協程代碼實現

1 協程函數的定義

正常函數怎么寫就怎么寫,在def前面加上async即可。如:

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

2 協程函數的調用

入口函數使用asyncio.run() 進行調用。如:

import asyncio
async def main():
    print(f"started at {time.strftime('%X')}")
    print('hello world!')
    print(f"finished at {time.strftime('%X')}")
if __name__ == "__main__":
    # 入口函數通過asyncio.run()調用
    asyncio.run(main())

一般協程函數調用時在其前面加上await關鍵字進行調用:

import asyncio
import time
async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)
async def main():
    print(f"started at {time.strftime('%X')}")
    # 在前面加上await進行調用
    # 這種形式和正常的同步執(zhí)行程序效果上沒什么區(qū)別,仍是執(zhí)行完上一步再執(zhí)行下一步
    await say_after(1, 'hello')
    await say_after(2, 'world')
    print(f"finished at {time.strftime('%X')}")
if __name__ == "__main__":
    # 入口函數通過asyncio.run()調用
    asyncio.run(main())

最后一種是通過asyncio.create_task()調用一般協程函數。

第二種調用方式也是調用一般協程函數,但是如果只是這么調用的話協程函數并沒有什么作用,比如上邊這個函數耗時仍然和正常的同步版本一樣是3秒。

協程的意義在正在于asyncio.create_task()調用形式,asyncio.create_task()可以將協程函數包裝成任務,多個任務之間可并行執(zhí)行。如下寫法只耗時2秒。

import asyncio
import time
#學習中遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流群:153708845
class TestAsync:
    async def say_after(self,delay, what):
        await asyncio.sleep(delay)
        print(what)
    async def main(self):
        print(f"started at {time.strftime('%X')}")
        task_list = []
        # 等價于[1,2]
        for i in range(1, 3, 1):
            # 步驟一、使用asyncio.create_task()調用協程函數,封裝成任務
            tmp_task = asyncio.create_task(self.say_after(i, 'hello'))
            task_list.append(tmp_task)
        # 第二步,await任務
        for tmp_task in task_list:
            await tmp_task
        print(f"finished at {time.strftime('%X')}")
if __name__ == "__main__":
    obj = TestAsync()
    asyncio.run(obj.main())

到此這篇關于Python中協程(coroutine)詳解的文章就介紹到這了,更多相關Python協程coroutine內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python單例模式的四種創(chuàng)建方式實例解析

    Python單例模式的四種創(chuàng)建方式實例解析

    這篇文章主要介紹了Python單例模式的四種創(chuàng)建方式實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 在Python中執(zhí)行系統(tǒng)命令的方法示例詳解

    在Python中執(zhí)行系統(tǒng)命令的方法示例詳解

    最近在做那個測試框架的時候發(fā)現對python執(zhí)行系統(tǒng)命令不太熟悉,所以想著總結下,下面這篇文章主要給大家介紹了關于在Python中執(zhí)行系統(tǒng)命令的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • python打造爬蟲代理池過程解析

    python打造爬蟲代理池過程解析

    這篇文章主要介紹了python打造爬蟲代理池過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python正則表達式高效處理文本數據的秘訣輕松掌握

    Python正則表達式高效處理文本數據的秘訣輕松掌握

    當談到文本處理和搜索時,正則表達式是Python中一個強大且不可或缺的工具,正則表達式是一種用于搜索、匹配和處理文本的模式描述語言,可以在大量文本數據中快速而靈活地查找、識別和提取所需的信息,
    2023-11-11
  • Python實現加密的RAR文件解壓的方法(密碼已知)

    Python實現加密的RAR文件解壓的方法(密碼已知)

    這篇文章主要介紹了Python實現加密的RAR文件解壓,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Python能干什么、Python主要應用于哪些方面

    Python能干什么、Python主要應用于哪些方面

    無論是從入門級選手到專業(yè)級選手都在做的爬蟲,還是Web程序開發(fā)、桌面程序開發(fā)還是科學計算、圖像處理, Python都可以勝任。Python為我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、 數據庫、文本等大量內容。用Python開發(fā),許多功能不必從零編寫
    2023-06-06
  • django富文本編輯器的實現示例

    django富文本編輯器的實現示例

    這篇文章主要介紹了django富文本編輯器的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 在Python中預先初始化列表內容和長度的實現

    在Python中預先初始化列表內容和長度的實現

    今天小編就為大家分享一篇在Python中預先初始化列表內容和長度的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python作用域與名字空間源碼學習筆記

    Python作用域與名字空間源碼學習筆記

    這篇文章主要為大家介紹了Python作用域與名字空間的源碼學習筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2022-05-05
  • Python使用MySQLdb for Python操作數據庫教程

    Python使用MySQLdb for Python操作數據庫教程

    這篇文章主要介紹了Python使用MySQLdb for Python操作數據庫教程,詳細講述了MySQLdb的用法,針對Python操作MySQL數據庫程序設計具有很好的參考借鑒價值,需要的朋友可以參考下
    2014-10-10

最新評論

西贡区| 彭州市| 龙里县| 囊谦县| 佛学| 青浦区| 永年县| 文水县| 石林| 许昌市| 海原县| 平凉市| 平利县| 镇赉县| 崇阳县| 安图县| 富阳市| 彩票| 南川市| 鹤山市| 那坡县| 彭州市| 洞头县| 碌曲县| 阿瓦提县| 蒙阴县| 黑龙江省| 六盘水市| 中超| 江北区| 乐清市| 四会市| 榆社县| 马山县| SHOW| 长泰县| 富平县| 虎林市| 赞皇县| 南江县| 新闻|