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

詳解python之異步編程

 更新時(shí)間:2021年12月24日 08:54:03   作者:Python_xiaowu  
這篇文章主要為大家介紹了python之異步編程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>

一、異步編程概述

異步編程是一種并發(fā)編程的模式,其關(guān)注點(diǎn)是通過(guò)調(diào)度不同任務(wù)之間的執(zhí)行和等待時(shí)間,通過(guò)減少處理器的閑置時(shí)間來(lái)達(dá)到減少整個(gè)程序的執(zhí)行時(shí)間;異步編程跟同步編程模型最大的不同就是其任務(wù)的切換,當(dāng)遇到一個(gè)需要等待長(zhǎng)時(shí)間執(zhí)行的任務(wù)的時(shí)候,我們可以切換到其他的任務(wù)執(zhí)行;

與多線(xiàn)程和多進(jìn)程編程模型相比,異步編程只是在同一個(gè)線(xiàn)程之內(nèi)的的任務(wù)調(diào)度,無(wú)法充分利用多核CPU的優(yōu)勢(shì),所以特別適合IO阻塞性任務(wù);

python 版本 3.9.5

二、python的異步框架模型

python提供了asyncio模塊來(lái)支持異步編程,其中涉及到coroutines、event loops、futures三個(gè)重要概念;

event loops主要負(fù)責(zé)跟蹤和調(diào)度所有異步任務(wù),編排具體的某個(gè)時(shí)間點(diǎn)執(zhí)行的任務(wù);

coroutines是對(duì)具體執(zhí)行任務(wù)的封裝,是一個(gè)可以在執(zhí)行中暫停并切換到event loops執(zhí)行流程的特殊類(lèi)型的函數(shù);其一般還需要?jiǎng)?chuàng)建task才能被event loops調(diào)度;

futures負(fù)責(zé)承載coroutines的執(zhí)行結(jié)果,其隨著任務(wù)在event loops中的初始化而創(chuàng)建,并隨著任務(wù)的執(zhí)行來(lái)記錄任務(wù)的執(zhí)行狀態(tài);

異步編程框架的整個(gè)執(zhí)行過(guò)程涉及三者的緊密協(xié)作;

首先事件循環(huán)啟動(dòng)之后,會(huì)從任務(wù)隊(duì)列獲取第一個(gè)要執(zhí)行的coroutine,并隨之創(chuàng)建對(duì)應(yīng)task和future;

然后隨著task的執(zhí)行,當(dāng)遇到coroutine內(nèi)部需要切換任務(wù)的地方,task的執(zhí)行就會(huì)暫停并釋放執(zhí)行線(xiàn)程給event loop,event loop接著會(huì)獲取下一個(gè)待執(zhí)行的coroutine,并進(jìn)行相關(guān)的初始化之后,執(zhí)行這個(gè)task;

隨著event loop執(zhí)行完隊(duì)列中的最后一個(gè)coroutine才會(huì)切換到第一個(gè)coroutine;

隨著task的執(zhí)行結(jié)束,event loops會(huì)將task清除出隊(duì)列,對(duì)應(yīng)的執(zhí)行結(jié)果會(huì)同步到future中,這個(gè)過(guò)程會(huì)持續(xù)到所有的task執(zhí)行結(jié)束;

三、順序執(zhí)行多個(gè)可重疊的任務(wù)

每個(gè)任務(wù)執(zhí)行中間會(huì)暫停給定的時(shí)間,循序執(zhí)行的時(shí)間就是每個(gè)任務(wù)執(zhí)行的時(shí)間加和;

import time
def count_down(name, delay):
    indents = (ord(name) - ord('A')) * '\t'
    n = 3
    while n:
        time.sleep(delay)
        duration = time.perf_counter() - start
        print('-' * 40)
        print(f'{duration:.4f} \t{indents}{name} = {n}')
        n -= 1
start = time.perf_counter()
count_down('A', 1)
count_down('B', 0.8)
count_down('C', 0.5)
print('-' * 40)
print('Done')
# ----------------------------------------
# 1.0010 	A = 3
# ----------------------------------------
# 2.0019 	A = 2
# ----------------------------------------
# 3.0030 	A = 1
# ----------------------------------------
# 3.8040 		B = 3
# ----------------------------------------
# 4.6050 		B = 2
# ----------------------------------------
# 5.4059 		B = 1
# ----------------------------------------
# 5.9065 			C = 3
# ----------------------------------------
# 6.4072 			C = 2
# ----------------------------------------
# 6.9078 			C = 1
# ----------------------------------------
# Done

四、異步化同步代碼

python在語(yǔ)法上提供了asyncawait兩個(gè)關(guān)鍵字來(lái)簡(jiǎn)化將同步代碼修改為異步;

async使用在函數(shù)的def關(guān)鍵字前邊,標(biāo)記這是一個(gè)coroutine函數(shù);

await用在conroutine里邊,用于標(biāo)記需要暫停釋放執(zhí)行流程給event loops;

await 后邊的表達(dá)式需要返回waitable的對(duì)象,例如conroutine、task、future等;

asyncio模塊主要提供了操作event loop的方式;

我們可以通過(guò)async將count_down標(biāo)記為coroutine,然后使用await和asyncio.sleep來(lái)實(shí)現(xiàn)異步的暫停,從而將控制權(quán)交給event loop;

async def count_down(name, delay, start):
    indents = (ord(name) - ord('A')) * '\t'
    n = 3
    while n:
        await asyncio.sleep(delay)
        duration = time.perf_counter() - start
        print('-' * 40)
        print(f'{duration:.4f} \t{indents}{name} = {n}')
        n -= 1

我們定義一個(gè)異步的main方法,主要完成task的創(chuàng)建和等待任務(wù)執(zhí)行結(jié)束;

async def main():
    start = time.perf_counter()
    tasks = [asyncio.create_task(count_down(name,delay,start)) for name, delay in [('A', 1),('B', 0.8),('C', 0.5)]]
    await asyncio.wait(tasks)
    print('-' * 40)
    print('Done')

執(zhí)行我們可以看到時(shí)間已經(jīng)變?yōu)榱藞?zhí)行時(shí)間最長(zhǎng)的任務(wù)的時(shí)間了;

asyncio.run(main())
# ----------------------------------------
# 0.5010 			C = 3
# ----------------------------------------
# 0.8016 		B = 3
# ----------------------------------------
# 1.0011 	A = 3
# ----------------------------------------
# 1.0013 			C = 2
# ----------------------------------------
# 1.5021 			C = 1
# ----------------------------------------
# 1.6026 		B = 2
# ----------------------------------------
# 2.0025 	A = 2
# ----------------------------------------
# 2.4042 		B = 1
# ----------------------------------------
# 3.0038 	A = 1
# ----------------------------------------
# Done

五、使用多線(xiàn)程克服具體任務(wù)的異步限制

異步編程要求具體的任務(wù)必須是coroutine,也就是要求方法是異步的,否則只有任務(wù)執(zhí)行完了,才能將控制權(quán)釋放給event loop;

python中的concurent.futures提供了ThreadPoolExecutor和ProcessPoolExecutor,可以直接在異步編程中使用,從而可以在單獨(dú)的線(xiàn)程或者進(jìn)程至今任務(wù);

import time
import asyncio
from concurrent.futures import ThreadPoolExecutor
def count_down(name, delay, start):
    indents = (ord(name) - ord('A')) * '\t'
    n = 3
    while n:
        time.sleep(delay)
        duration = time.perf_counter() - start
        print('-'*40)
        print(f'{duration:.4f} \t{indents}{name} = {n}')
        n -=1
async def main():
    start = time.perf_counter()
    loop = asyncio.get_running_loop()
    executor = ThreadPoolExecutor(max_workers=3)
    fs = [
       loop.run_in_executor(executor, count_down, *args)  for args in [('A', 1, start), ('B', 0.8, start), ('C', 0.5, start)]
    ]
    await asyncio.wait(fs)
    print('-'*40)
    print('Done.')
asyncio.run(main())
# ----------------------------------------
# 0.5087 			C = 3
# ----------------------------------------
# 0.8196 		B = 3
# ----------------------------------------
# 1.0073 	A = 3
# ----------------------------------------
# 1.0234 			C = 2
# ----------------------------------------
# 1.5350 			C = 1
# ----------------------------------------
# 1.6303 		B = 2
# ----------------------------------------
# 2.0193 	A = 2
# ----------------------------------------
# 2.4406 		B = 1
# ----------------------------------------
# 3.0210 	A = 1
# ----------------------------------------
# Done.
 

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 使用Python編寫(xiě)簡(jiǎn)單的端口掃描器的實(shí)例分享

    使用Python編寫(xiě)簡(jiǎn)單的端口掃描器的實(shí)例分享

    這篇文章主要介紹了使用Python編寫(xiě)簡(jiǎn)單的端口掃描器的實(shí)例分享,文中分別介紹了單線(xiàn)程和多線(xiàn)程的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2015-12-12
  • python?+?pyqt5制作一個(gè)串口助手

    python?+?pyqt5制作一個(gè)串口助手

    這篇文章主要介紹了python?+?pyqt5制作一個(gè)串口助手,串口助手是串口通信使用的工具,為整合知識(shí),打算做個(gè)串口助手,本文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • python繪制地震散點(diǎn)圖

    python繪制地震散點(diǎn)圖

    這篇文章主要為大家詳細(xì)介紹了python繪制地震散點(diǎn)圖的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 關(guān)于python列表增加元素的三種操作方法

    關(guān)于python列表增加元素的三種操作方法

    這篇文章主要介紹了關(guān)于python列表增加元素的幾種操作方法,主要有insert方法,extend方法和append方法,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-08-08
  • 使用opencv中匹配點(diǎn)對(duì)的坐標(biāo)提取方式

    使用opencv中匹配點(diǎn)對(duì)的坐標(biāo)提取方式

    這篇文章主要介紹了使用opencv中匹配點(diǎn)對(duì)的坐標(biāo)提取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • VSCode配置Anaconda Python環(huán)境的實(shí)現(xiàn)

    VSCode配置Anaconda Python環(huán)境的實(shí)現(xiàn)

    VisualStudioCode中可以使用Anaconda環(huán)境進(jìn)行Python開(kāi)發(fā),本文主要介紹了VSCode配置Anaconda Python環(huán)境的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 使用Python自定義創(chuàng)建的Log日志模塊

    使用Python自定義創(chuàng)建的Log日志模塊

    這篇文章主要介紹了使用Python自定義創(chuàng)建的Log日志模塊,日志文件是用于記錄系統(tǒng)操作事件的文件集合,可分為事件日志和消息日志。具有處理歷史數(shù)據(jù)、診斷問(wèn)題的追蹤以及理解系統(tǒng)的活動(dòng)等重要作用,需要的朋友可以參考下
    2023-07-07
  • Python基于Google?Bard實(shí)現(xiàn)交互式聊天機(jī)器人

    Python基于Google?Bard實(shí)現(xiàn)交互式聊天機(jī)器人

    這篇文章主要為大家介紹了Python基于Google?Bard實(shí)現(xiàn)交互式聊天機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • python中如何使用正則表達(dá)式的非貪婪模式示例

    python中如何使用正則表達(dá)式的非貪婪模式示例

    貪婪與非貪婪模式影響的是被量詞修飾的子表達(dá)式的匹配行為,下面這篇文章主要給大家介紹了關(guān)于python中如何使用正則表達(dá)式的非貪婪模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-10-10
  • Python開(kāi)發(fā)之城堡保衛(wèi)戰(zhàn)游戲的實(shí)現(xiàn)

    Python開(kāi)發(fā)之城堡保衛(wèi)戰(zhàn)游戲的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用Python編寫(xiě)一個(gè)簡(jiǎn)單的城堡保衛(wèi)戰(zhàn)游戲,本文用到了os文件讀寫(xiě),pygame模塊以及面向?qū)ο笏枷耄信d趣的可以了解一下
    2023-01-01

最新評(píng)論

西吉县| 济阳县| 紫金县| 黄平县| 诸暨市| 全南县| 肥城市| 富平县| 嘉善县| 鄂托克前旗| 宝清县| 庆元县| 苍南县| 辽阳市| 高平市| 昭苏县| 定州市| 兰州市| 平武县| 绥宁县| 汪清县| 英吉沙县| 尼玛县| 汽车| 开江县| 景德镇市| 高碑店市| 永修县| 英吉沙县| 桂林市| 宜州市| 长宁县| 上饶县| 乌苏市| 信丰县| 达孜县| 高邮市| 仁寿县| 塘沽区| 平凉市| 锡林郭勒盟|