日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python中asyncio異步編程學習

瀏覽:23日期:2022-06-23 11:40:17
1.   想學asyncio,得先了解協(xié)程

攜程的意義:

計算型的操作,利用協(xié)程來回切換執(zhí)行,沒有任何意義,來回切換并保存狀態(tài) 反倒會降低性能。 IO型的操作,利用協(xié)程在IO等待時間就去切換執(zhí)行其他任務,當IO操作結束后再自動回調,那么就會大大節(jié)省資源并提供性能,從而實現(xiàn)異步編程(不等待任務結束就可以去執(zhí)行其他代碼2.協(xié)程和多線程之間的共同點和區(qū)別:

共同點:

都是并發(fā)操作,多線程同一時間點只能有一個線程在執(zhí)行,協(xié)程同一時間點只能有一個任務在執(zhí)行;

不同點:

多線程,是在I/O阻塞時通過切換線程來達到并發(fā)的效果,在什么情況下做線程切換是由操作系統(tǒng)來決定的,開發(fā)者不用操心,但會造成競爭條件 (race condition) ;

協(xié)程,只有一個線程,在I/O阻塞時通過在線程內切換任務來達到并發(fā)的效果,在什么情況下做任務切換是開發(fā)者決定的,不會有競爭條件 (race condition) 的情況;多線程的線程切換比協(xié)程的任務切換開銷更大;對于開發(fā)者而言,多線程并發(fā)的代碼比協(xié)程并發(fā)的更容易書寫。

一般情況下協(xié)程并發(fā)的處理效率比多線程并發(fā)更高。

3. greenlet實現(xiàn)協(xié)程

greenlet用于創(chuàng)建協(xié)程,switch用于進行協(xié)程之間的切換某個協(xié)程在執(zhí)行的過程中可以隨時的被其他協(xié)程通過switch函數(shù)來打斷,轉而去執(zhí)行其他協(xié)程,當前協(xié)程的中斷現(xiàn)場會被保留,一旦中斷的協(xié)程再次獲得cpu的執(zhí)行權首先會恢復現(xiàn)場然后從中斷處繼續(xù)執(zhí)行這種機制下的協(xié)程是同步,不能并發(fā)

pip install greenlet

import timeimport greenlet def func1(): print('func11') gr2.switch() time.sleep(1) print('func22') gr2.switch() def func2(): print('func33') gr1.switch() time.sleep(1) print('func44') start = time.time()gr1 = greenlet.greenlet(func1)gr2 = greenlet.greenlet(func2)gr1.switch()end = time.time()print(end - start)4. yield關鍵字實現(xiàn)協(xié)程

def func1(): yield 1 yield from func2() yield 3 def func2(): yield 2 yield 4 ff = func1()for item in ff: print(item)5.gevent協(xié)程(1)gevent實現(xiàn)協(xié)程

pip install gevent

from greenlet import greenletfrom time import sleepdef func1(): print('協(xié)程1') sleep(2) g2.switch() print('協(xié)程1恢復運行') def func2(): print('協(xié)程2') sleep(1) g3.switch()def func3(): print('協(xié)程3') sleep(1) g1.switch() if __name__ == ’__main__’: # 使用greenlet來創(chuàng)建三個協(xié)程 g1 = greenlet(func1) g2 = greenlet(func2) g3 = greenlet(func3) # print(g1) g1.switch() # 讓協(xié)程g1取搶占cpu資源(2) gevent實現(xiàn)異步協(xié)程

# 協(xié)程被創(chuàng)建出來以后默認是多個協(xié)程同步執(zhí)行# 我們可以加入monkey補丁,把同步的協(xié)程轉成異步協(xié)程from gevent import monkey # 注意:monkey的引入必須在其他模塊之前 monkey.patch_all() # 用monkey給整個協(xié)程隊列,添加一個非阻塞I/O的補丁,使得他們成為異步協(xié)程import timeimport requestsimport gevent headers = { ’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36’} def func(url, i): print('協(xié)程%d開啟!' % i) res = requests.get(url=url, headers=headers) html = res.text print('協(xié)程%d執(zhí)行結束,獲取到的響應體大小為:%d' % (i, len(html))) if __name__ == ’__main__’: start = time.time() urls = [ 'https://www.baidu.com/', 'https://www.qq.com/', 'https://www.sina.com.cn', 'https://www.ifeng.com/', 'https://www.163.com/' ] # 創(chuàng)建5個協(xié)程分別對上面5個網(wǎng)站進行訪問 g_list = [] for i in range(len(urls)): g = gevent.spawn(func, urls[i], i) g_list.append(g) # func(urls[i], i) gevent.joinall(g_list) end = time.time() print(end - start)6. asyncio模塊實現(xiàn)異步協(xié)程

在python3.4及之后的版本使用,asyncio厲害之處在于:遇到IO操作時會自動切換執(zhí)行其它任務

import timeimport asyncio @asyncio.coroutinedef func1(): print(1) yield from asyncio.sleep(1) # 遇到IO耗時操作,自動切換到tasks中的其它任務 print(2) @asyncio.coroutinedef func2(): print(3) yield from asyncio.sleep(1) # 遇到IO耗時操作,自動切換到tasks中的其它任務 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2())] start = time.time()loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))end = time.time()print(end - start)7. asyc & await關鍵字實現(xiàn)異步編程(現(xiàn)在推薦使用的用法)

在python3.5及之后的版本中可以使用

import timeimport asyncio async def func1(): print(1) await asyncio.sleep(1) print(2) async def func2(): print(3) await asyncio.sleep(1) print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2())] start = time.time()loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))end = time.time()print(end - start)7.1 事件循環(huán)

    事件循環(huán),可以把他當做是一個while循環(huán),這個while循環(huán)在周期性的運行并執(zhí)行一些任務,在特定條件下終止循環(huán)。

偽代碼:

# 偽代碼任務列表 = [ 任務1, 任務2, 任務3,... ]while True: 可執(zhí)行的任務列表,已完成的任務列表 = 去任務列表中檢查所有的任務,將’可執(zhí)行’和’已完成’的任務返回 for 就緒任務 in 已準備就緒的任務列表: 執(zhí)行已就緒的任務 for 已完成的任務 in 已完成的任務列表: 在任務列表中移除 已完成的任務 如果 任務列表 中的任務都已完成,則終止循環(huán)7.2 協(xié)程和異步編程

協(xié)程函數(shù),定義形式為 async def 的函數(shù)。

協(xié)程對象,調用 協(xié)程函數(shù) 所返回的對象。

# 定義一個協(xié)程函數(shù)async def func(): pass# 調用協(xié)程函數(shù),返回一個協(xié)程對象result = func()

注意:調用協(xié)程函數(shù)時,函數(shù)內部代碼不會執(zhí)行,只是會返回一個協(xié)程對象。 

7.3 基本應用

程序中,如果想要執(zhí)行協(xié)程函數(shù)的內部代碼,需要 事件循環(huán) 和 協(xié)程對象 配合才能實現(xiàn),如:

import asyncioasync def func(): print('協(xié)程內部代碼')# 調用協(xié)程函數(shù),返回一個協(xié)程對象。result = func()# 方式一# loop = asyncio.get_event_loop() # 創(chuàng)建一個事件循環(huán)# loop.run_until_complete(result) # 將協(xié)程當做任務提交到事件循環(huán)的任務列表中,協(xié)程執(zhí)行完成之后終止。# 方式二# 本質上方式一是一樣的,內部先 創(chuàng)建事件循環(huán) 然后執(zhí)行 run_until_complete,一個簡便的寫法。# asyncio.run 函數(shù)在 Python 3.7 中加入 asyncio 模塊,asyncio.run(result)

這個過程可以簡單理解為:將協(xié)程當做任務添加到 事件循環(huán) 的任務列表,然后事件循環(huán)檢測列表中的協(xié)程是否 已準備就緒(默認可理解為就緒狀態(tài)),如果準備就緒則執(zhí)行其內部代碼。

7.4 await關鍵字

await是一個只能在協(xié)程函數(shù)中使用的關鍵字,用于遇到IO操作時掛起 當前協(xié)程(任務),當前協(xié)程(任務)掛起過程中 事件循環(huán)可以去執(zhí)行其他的協(xié)程(任務),當前協(xié)程IO處理完成時,可以再次切換回來執(zhí)行await之后的代碼,

await + 可等待對象(協(xié)程對象、Future對象、Task對象)

示例1:await+協(xié)程對象

import asyncio async def func1(): print('start') await asyncio.sleep(1) print('end') return 'func1執(zhí)行完畢' async def func2(): print('func2開始執(zhí)行') # await關鍵字后面可以跟可等待對象(協(xié)程對象、Future對象、Task對象) response = await func1() print(response) print('func2執(zhí)行完畢') asyncio.run(func2())

示例2: 協(xié)程函數(shù)中可以使用多次await關鍵字

import asyncio async def func1(): print('start') await asyncio.sleep(1) print('end') return 'func1執(zhí)行完畢' async def func2(): print('func2開始執(zhí)行') # await關鍵字后面可以跟可等待對象(協(xié)程對象、Future對象、Task對象) response = await func1() print(response) response2 = await func1() print(response2) print('func2執(zhí)行完畢') asyncio.run(func2())7.5 task對象

Tasks用于并發(fā)調度協(xié)程,通過asyncio.create_task(協(xié)程對象)的方式創(chuàng)建Task對象,這樣可以讓協(xié)程加入事件循環(huán)中等待被調度執(zhí)行。除了使用 asyncio.create_task() 函數(shù)以外,還可以用低層級的 loop.create_task() 或 ensure_future() 函數(shù)。不建議手動實例化 Task 對象。

本質上是將協(xié)程對象封裝成task對象,并將協(xié)程立即加入事件循環(huán),同時追蹤協(xié)程的狀態(tài)。

注意:asyncio.create_task() 函數(shù)在 Python 3.7 中被加入。在 Python 3.7 之前,可以改用低層級的 asyncio.ensure_future() 函數(shù)。

示例1:

import asyncio async def func(): print(1) await asyncio.sleep(1) print(2) return 'func的返回值' async def main(): print(3) # 創(chuàng)建協(xié)程,將協(xié)程封裝到一個task對象中并立即添加到事件循環(huán)列表中,等待事件循環(huán)去執(zhí)行,(默認是就緒狀態(tài)) task1 = asyncio.create_task(func()) # 創(chuàng)建協(xié)程,將協(xié)程封裝到一個task對象中并立即添加到事件循環(huán)列表中,等待事件循環(huán)去執(zhí)行,(默認是就緒狀態(tài)) task2 = asyncio.create_task(func()) # 當執(zhí)行某協(xié)程遇到IO操作時,會自動化切換執(zhí)行其他任務。 # 此處的await是等待相對應的協(xié)程全都執(zhí)行完畢并獲取結果 ret1 = await task1 ret2 = await task2 print(ret1, ret2) asyncio.run(main())

示例2:用的還是比較多的

import asyncio async def func(): print(1) await asyncio.sleep(1) print(2) return 'func的返回值' async def main(): print(3) # 創(chuàng)建協(xié)程,將協(xié)程封裝到Task對象中并添加到事件循環(huán)的任務列表中,等待事件循環(huán)去執(zhí)行(默認是就緒狀態(tài))。 # 在調用 task_list = [ asyncio.create_task(func()), asyncio.create_task(func()) ] # 當執(zhí)行某協(xié)程遇到IO操作時,會自動化切換執(zhí)行其他任務。 # 此處的await是等待所有協(xié)程執(zhí)行完畢,并將所有協(xié)程的返回值保存到done # 如果設置了timeout值,則意味著此處最多等待的秒,完成的協(xié)程返回值寫入到done中,未完成則寫到pending中。 done, pending = await asyncio.wait(task_list, timeout=None) print(done) print(pending) asyncio.run(main())

 示例3:

import asyncio async def func(): print('執(zhí)行協(xié)程函數(shù)內部代碼') # 遇到IO操作掛起當前協(xié)程(任務),等IO操作完成之后再繼續(xù)往下執(zhí)行。當前協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他協(xié)程(任務)。 response = await asyncio.sleep(2) print('IO請求結束,結果為:', response) coroutine_list = [func(), func()]# 錯誤:coroutine_list = [ asyncio.create_task(func()), asyncio.create_task(func()) ]# 此處不能直接 asyncio.create_task,因為將Task立即加入到事件循環(huán)的任務列表,# 但此時事件循環(huán)還未創(chuàng)建,所以會報錯。# 使用asyncio.wait將列表封裝為一個協(xié)程,并調用asyncio.run實現(xiàn)執(zhí)行兩個協(xié)程# asyncio.wait內部會對列表中的每個協(xié)程執(zhí)行ensure_future,封裝為Task對象。done, pending = asyncio.run(asyncio.wait(coroutine_list))

總結:

在程序中只要看到async和await關鍵字,其內部就是基于協(xié)程實現(xiàn)的異步編程,這種異步編程是通過一個線程在IO等待時間去執(zhí)行其他任務,從而實現(xiàn)并發(fā)。

如果是 I/O 密集型,且 I/O 請求比較耗時的話,使用協(xié)程。如果是 I/O 密集型,且 I/O 請求比較快的話,使用多線程。如果是 計算 密集型,考慮可以使用多核 CPU,使用多進程。

以上就是python中asyncio異步編程學習的詳細內容,更多關于python中使用asyncio的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
最新国产拍偷乱拍精品| 国产成人精品999在线观看| 亚洲精品自拍| 国产精品白丝一区二区三区| 中文字幕亚洲影视| 99日韩精品| 日韩一级精品| 免费日韩av片| 99成人在线| 91精品成人| 欧美女激情福利| 日韩在线a电影| 欧美一区二区三区高清视频| 99精品视频在线观看免费播放| 日韩国产一区二区| 美女视频黄久久| 亚洲www啪成人一区二区| 亚洲综合五月| 亚洲精品美女91| 国产精选一区| 偷拍精品精品一区二区三区| 综合日韩av| 午夜精品免费| 婷婷精品在线| 久久爱www.| 亚洲手机视频| 欧美一级一区| 成人在线视频中文字幕| 日韩高清在线不卡| 国产一区日韩一区| 国产精品99免费看| 日韩在线卡一卡二| 尹人成人综合网| 亚洲视频国产精品| 麻豆精品一区二区综合av| 四虎成人av| 亚州精品视频| 亚洲调教视频在线观看| 久久亚州av| 久久xxxx| 亚洲伦乱视频| 91精品啪在线观看国产爱臀| 秋霞影院一区二区三区| 欧美一级二级三级视频| 亚洲国产综合在线看不卡| 国产精品mv在线观看| 不卡在线一区二区| 蜜桃视频在线观看一区| 国产一区二区久久久久| 亚洲一区二区三区四区电影| 精品视频高潮| 日韩中文字幕无砖| 国产农村妇女精品一区二区 | 视频在线观看国产精品| 日韩在线看片| 麻豆国产精品| 日韩国产欧美在线播放| 欧美中文字幕| 欧美不卡高清| 亚洲电影有码| 国产高潮在线| 国产日韩欧美在线播放不卡| 在线亚洲一区| 91成人网在线观看| 久久精品99久久无色码中文字幕| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产精品porn| 久久99蜜桃| 久久xxxx精品视频| 日韩中文字幕1| 久久精品超碰| 日韩欧美高清一区二区三区| 欧美羞羞视频| 国产精品视频一区二区三区 | 亚洲免费影院| 国产 日韩 欧美一区| 亚洲国产专区校园欧美| 亚洲免费福利一区| 亚洲天堂av影院| 亚州av日韩av| 久久亚洲在线| 麻豆精品国产91久久久久久| 成人自拍av| 性欧美69xoxoxoxo| 日本精品久久| 免费高潮视频95在线观看网站| 亚洲在线观看| 欧美a一区二区| 在线综合亚洲| 欧美成a人片免费观看久久五月天| 欧美日韩亚洲一区| 免费在线亚洲欧美| 欧美xxxx中国| 免费看黄色91| 成人国产精品一区二区网站| 久久亚洲在线| 国产精品magnet| 欧美成人高清| 91精品国产自产在线丝袜啪| 成人午夜精品| 欧美天堂一区| 亚洲成人av观看| 国产欧美日本| 日韩精品首页| 天海翼亚洲一区二区三区| 国产精品亚洲综合色区韩国| 五月天久久久| 高清不卡一区| 欧美激情福利| 欧美另类中文字幕| 久久性天堂网| 午夜精品网站| 亚洲天堂久久| 日韩国产欧美| 精品三级国产| 国产精品久久久久久久免费软件| 亚洲综合二区| 香蕉视频成人在线观看| 99久久婷婷这里只有精品| 韩国久久久久久| 日韩av一二三| 亚洲精品美女| 色婷婷成人网| 日韩精品欧美大片| 免费人成网站在线观看欧美高清| 国内精品99| 99久久激情| 国产精品呻吟| 亚洲精品影院在线观看| 亚洲精品视频一二三区| 中文无码日韩欧| 亚洲精品第一| 日本不卡在线视频| 国产精品一区二区美女视频免费看 | 中文久久精品| 亚洲区第一页| 久久99久久人婷婷精品综合| 国产亚洲一区二区手机在线观看 | 国产精品成人国产| 欧美好骚综合网| 精品日韩毛片| 午夜一级在线看亚洲| 91欧美精品| 视频二区不卡| 亚洲精品日本| 999国产精品永久免费视频app| 午夜亚洲福利在线老司机| 久久久久九九精品影院| 国产女优一区| www.九色在线| 日本午夜精品| 亚洲久草在线| 国产99久久| 日韩av资源网| 亚洲免费一区二区| 精品捆绑调教一区二区三区| 国产精品xxx| 午夜天堂精品久久久久| 国产一区精品福利| 亚洲精品乱码| 久久最新视频| 久久亚洲在线| 久久久久久夜| 精品视频高潮| 国产一区二区三区四区五区| 久久蜜桃精品| 麻豆国产精品| 国产精品777777在线播放| 天堂а√在线最新版中文在线| 日韩不卡免费视频| 黄色日韩在线| 人人爱人人干婷婷丁香亚洲| 国产精品社区| 一本大道色婷婷在线| 日本免费新一区视频| 中文不卡在线| 黄色日韩在线| 欧美aa一级| 久久婷婷激情| 国产videos久久| 国产精品啊v在线| 日韩三级精品| 日本一区免费网站| 999久久久91| 日韩久久视频| 人人精品久久| 久久精品91| 狂野欧美性猛交xxxx| 久久久久久婷| 日本成人手机在线| 国产精品超碰| 9999国产精品| 日韩欧美1区| 蜜桃av一区| 国产欧美日韩在线一区二区| 欧美国产亚洲精品| 欧美在线资源| 欧美中文一区| 国产精品一区二区三区www| 日韩一区二区三区在线免费观看|