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

淺談Python協(xié)程asyncio

 更新時間:2021年06月20日 09:59:51   作者:小玖工作坊  
今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著Python協(xié)程展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

一、協(xié)程

官方描述;
協(xié)程是子例程的更一般形式。 子例程可以在某一點進入并在另一點退出。 協(xié)程則可以在許多不同的點上進入、退出和恢復。 它們可通過 async def 語句來實現(xiàn)。 參見 PEP 492。

  • 協(xié)程不是計算機內部提供的,不像進程、線程,由電腦本身提供,它是由程序員人為創(chuàng)造的, 實現(xiàn)函數(shù)異步執(zhí)行。
  • 協(xié)程(Coroutine),也可以被稱為微線程,是一種用戶太內的上下文切換技術,其實就是通過一個線程實現(xiàn)代碼塊相互切換執(zhí)行。看上去像子程序,但執(zhí)行過程中,在子程序內部可中斷,然后轉而執(zhí)行別的子程序,在適當?shù)臅r候再返回來接著執(zhí)行。例如:
# 需要python3.7+
import asyncio


async def main():
    print('hello')
    await asyncio.sleep(1)
    print('world')

asyncio.run(main())

# 打印 "hello",等待 1 秒,再打印 "world"

注意:簡單地調用一個協(xié)程并不會使其被調度執(zhí)行,

直接main() 調用會有問題:

RuntimeWarning: coroutine 'main' was never awaited
  main()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

def func1():
    print(1)
    ...
    print(2)
    
def func2():
    print(3)
    ...
    print(4)

func1()
func2() 

# 結果:1 2 3 4

實現(xiàn)協(xié)程的方法:

  • greenlet,早期模塊【不建議使用】
  • yield關鍵字,它是python的生成器,具有保存狀態(tài),切換到其他函數(shù)去執(zhí)行,再切換回原函數(shù)的功能。
  • asyncio裝飾器(python3.4引入)
  • async、await 關鍵字(python3.5)【推薦使用】

1.1 greenlet實現(xiàn)協(xié)程

# 第三方模塊,因此需要安裝

pip install greenlet
from greenlet import greenlet


def func1():
    print(1)
    gr2.switch()
    print(2)
    gr2.switch()


def func2():
    print(3)
    gr1.switch()
    print(4)


gr1 = greenlet(func1)
gr2 = greenlet(func2)

gr1.switch()

# 結果:1 3 2 4

1.2 yield關鍵字

def func1():
    yield 1
    yield from func2()
    yield 2


def func2():
    yield 3
    yield 4

f1 = func1()
for item in f1:
    print(item)
    
# 結果:1 3 2 4

1.3 asynico裝飾器

python3.4 及之后版本支持

DeprecationWarning: “@coroutine” decorator is deprecated since Python 3.8, use “async def”
翻譯:@coroutine"裝飾器自Python 3.8起已棄用,請使用"async def"代替

所以這個也不支持。

import asyncio

@asyncio.coroutine
def func1():
    print(1)
    yield from asyncio.sleep(2)  # 遇到IO耗時操作,自動切換到tasks中其他任務,比如:網(wǎng)絡IO,下載圖片
    print(2)

@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(2)  # 遇到IO耗時操作,自動切換到tasks中其他任務,比如:網(wǎng)絡IO,下載圖片
    print(4)

tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

# 結果: 1 3 2 4

1.4 async & await 關鍵字

import asyncio


async def func1():
    print(1)
    await asyncio.sleep(2)  # 遇到IO耗時操作,自動切換到tasks中其他任務,比如:網(wǎng)絡IO,下載圖片
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(2)  # 遇到IO耗時操作,自動切換到tasks中其他任務,比如:網(wǎng)絡IO,下載圖片
    print(4)

tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

二、協(xié)程的意義

充分利用線程。在一個線程中如果遇到IO等待時間線程不會一直等待,利用空閑時間再去干點其他事情。

以下載三張圖片為例:

普通方式(同步)下載:

import time
import requests

def download_image(url, img_name):
    print("開始下載:", url)
    # 發(fā)送網(wǎng)絡請求,下載圖片
    response = requests.get(url)
    print("下載完成")
    # 圖片保存到本地文件
    file_name = str(img_name) + '.png'
    with open(file_name, mode='wb') as file:
        file.write(response.content)

if __name__ == '__main__':
    start = time.time()
    url_list = [
        'https://tse4-mm.cn.bing.net/th/id/OIP.866vRxQ8QvyDsrUuXiu7qwHaNK?w=182&h=324&c=7&o=5&pid=1.7',
        'https://tse2-mm.cn.bing.net/th/id/OIP.HUcWtoYPG-z2pu4ityajbAHaKQ?w=182&h=252&c=7&o=5&pid=1.7',
        'https://tse2-mm.cn.bing.net/th/id/OIP.MvncR0-Pt9hVxKTdrvD9dAHaNK?w=182&h=324&c=7&o=5&pid=1.7',
        'https://tse1-mm.cn.bing.net/th/id/OIP._nGloaeMWbL7NB7Lp6SnXQHaLH?w=182&h=273&c=7&o=5&pid=1.7',
        ]
    img_name = 1
    for item in url_list:
        download_image(item, img_name)
        img_name += 1
    end = time.time()
    print(end - start)
    
 # 最終時間:7.25s

協(xié)程方式(異步)下載:

import aiohttp
import asyncio
import time


async def fetch(session, url):
    print("發(fā)送請求:", url)

    async with session.get(url, verify_ssl=False) as response:
        content = await response.content.read()
        file_name = url.rsplit('_')[-1]
        # print(file_name)
        with open(file_name, mode='wb') as file_object:
            file_object.write(content)
        print("下載完成")


async def main():
    async with aiohttp.ClientSession() as session:
        url_list = [
            'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
            'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
            'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
            'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
        ]
        tasks = [asyncio.ensure_future(fetch(session, url)) for url in url_list]
        await asyncio.wait(tasks)

if __name__ == '__main__':
    start = time.time()
    asyncio.get_event_loop().run_until_complete(main())
    end = time.time()
    print(end - start)
    
# 結果:0.05s

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

相關文章

  • Python 新建文件夾與復制文件夾內所有內容的方法

    Python 新建文件夾與復制文件夾內所有內容的方法

    今天小編就為大家分享一篇Python 新建文件夾與復制文件夾內所有內容的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python和Plotly實現(xiàn)3D圖形繪制

    Python和Plotly實現(xiàn)3D圖形繪制

    在當今的數(shù)據(jù)分析和可視化領域,Python已經成為一種不可或缺的工具,Plotly作為一種高級的繪圖庫,特別擅長于創(chuàng)建交互式和3D圖形,下面我們就來看看Python如何利用Plotly實現(xiàn)3D圖形繪制吧
    2024-11-11
  • 使用python serial 獲取所有的串口名稱的實例

    使用python serial 獲取所有的串口名稱的實例

    今天小編就為大家分享一篇使用python serial 獲取所有的串口名稱的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python基礎入門之魔法方法與異常處理

    Python基礎入門之魔法方法與異常處理

    在python中,所有以“__"雙下劃線包起來的方法,都統(tǒng)稱為魔法方法,下面這篇文章主要給大家介紹了關于Python基礎入門之魔法方法與異常處理的相關資料,需要的朋友可以參考下
    2021-11-11
  • Python GUI之tkinter詳解

    Python GUI之tkinter詳解

    今天帶大家學習Python GUI之tkinter的相關知識,文中對如何使用tkinter作了非常詳細的介紹及代碼示例,對正在學習python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-10-10
  • Python實現(xiàn)遞歸遍歷文件夾并刪除文件

    Python實現(xiàn)遞歸遍歷文件夾并刪除文件

    本文給大家匯總了3個Python實現(xiàn)遍歷文件夾并刪除的代碼,主要是給大家分享下這3種方法的實現(xiàn)思路,有需要的小伙伴可以參考下
    2016-04-04
  • Python讀寫二進制文件的實現(xiàn)

    Python讀寫二進制文件的實現(xiàn)

    本文主要介紹了Python讀寫二進制文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 了解一下python內建模塊collections

    了解一下python內建模塊collections

    這篇文章主要介紹了Python內建模塊——collections的相關資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • python爬蟲項目設置一個中斷重連的程序的實現(xiàn)

    python爬蟲項目設置一個中斷重連的程序的實現(xiàn)

    這篇文章主要介紹了python爬蟲項目設置一個中斷重連的程序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • django如何部署到centos服務器上

    django如何部署到centos服務器上

    django項目寫完以后最好能部署到服務器上,這樣就可以在隨時隨地查看內容了,本文主要介紹了django如何部署到centos服務器上,感興趣的可以了解一下
    2023-08-08

最新評論

稻城县| 德保县| 吕梁市| 天长市| 曲阳县| 潼南县| 松原市| 长丰县| 壶关县| 宜兰县| 成武县| 霍林郭勒市| 威信县| 曲周县| 冷水江市| 遵义县| 东阿县| 临猗县| 乐亭县| 汤阴县| 云龙县| 昌平区| 横山县| 富民县| 沙河市| 依安县| 平潭县| 托克逊县| 柘荣县| 大田县| 隆安县| 铜鼓县| 安化县| 建德市| 聂荣县| 三门峡市| 台东市| 张家界市| 岳西县| 团风县| 吴旗县|