Python?中的異步?for?循環(huán)示例詳解
本篇文章將提供有關(guān) Python 中異步 for 循環(huán)的完整詳細(xì)信息。 我們將討論異步函數(shù)、異步 for 循環(huán)和睡眠概念。
接下來,我們將討論 Python 庫 asyncio 和運(yùn)行異步代碼所需的函數(shù)。 最后,我們將看到幾個 Python 示例,以充分理解這個概念。
Python 中的異步函數(shù)
異步函數(shù)有助于與同一程序的其他函數(shù)并行運(yùn)行繁重的任務(wù)(如批處理程序,也許我們對在后臺運(yùn)行進(jìn)程感興趣)。 當(dāng)函數(shù)不相互依賴或不完全相互依賴時,可以并行運(yùn)行函數(shù)。
同步函數(shù)在任務(wù)完成后返回控制權(quán),而異步函數(shù)返回控制權(quán)以并行運(yùn)行其他函數(shù)/代碼并在一段時間后取回控制權(quán)。 這樣,不僅完成了繁重的任務(wù),還并行完成了許多其他任務(wù)。
從技術(shù)上講,同步函數(shù)會阻塞主函數(shù)的控制,而異步函數(shù)的執(zhí)行不會阻塞主函數(shù)。 這樣,主函數(shù)可以并行運(yùn)行多個異步函數(shù)。
Python 中的異步 for 循環(huán)
對于同步循環(huán),它們在沒有任何暫停/給予控制的情況下執(zhí)行; 但是,要使它們異步,我們必須在一些異步函數(shù)中定義它們。 此外,我們需要在這個過程中休眠一段時間,以控制其他一些功能。
使用睡眠語句
進(jìn)程/線程/函數(shù)可能會休眠一段時間; 你可以考慮休息一下。 但是,目的是在一段時間內(nèi)失去控制。
結(jié)果,其他一些功能獲得了控制權(quán)。 一段時間后,控制返回,功能恢復(fù)。
現(xiàn)在,是時候轉(zhuǎn)向 Python 中的實現(xiàn)了。 我們將逐步討論語法部分,最后,我們將展示完整的代碼。
Python 庫和函數(shù)
asyncio
是 Python 中的一個庫,用于使用 async/await 語法編寫并發(fā)程序/函數(shù)。 async 是每個函數(shù)開頭使用的關(guān)鍵字(用于創(chuàng)建異步函數(shù))。
語法是:
async def fun_a(t):
這里加入了 async
,將這個函數(shù)聲明為異步函數(shù)。
sleep 函數(shù)可以暫停協(xié)程的執(zhí)行一段時間。 協(xié)程是在執(zhí)行過程中構(gòu)成管道結(jié)構(gòu)的進(jìn)程/函數(shù)。
該函數(shù)通過 await 關(guān)鍵字自愿離開 CPU 去執(zhí)行另一個協(xié)作任務(wù)。 睡眠函數(shù)的語法是:
await asyncio.sleep(1)
await
關(guān)鍵字將控制權(quán)返回給事件循環(huán)。 您可能會考慮,如果使用 await
命令調(diào)用異步函數(shù),則 sleep 語句(在 for 循環(huán)內(nèi))控制協(xié)作進(jìn)程直到睡眠。
gather 函數(shù)將多個協(xié)作進(jìn)程(技術(shù)上稱為協(xié)程)組合起來作為一個單元運(yùn)行。 此函數(shù)按照在 gather 調(diào)用中編寫的函數(shù)的順序返回結(jié)果元組。
語法是:
results = await asyncio.gather(fun_a(5), fun_b(5))
在這里,我們正在制作 fun_a 和 fun_b 的管道,以便它們可以同時運(yùn)行。
事件循環(huán)是每個異步應(yīng)用程序的主要組成部分。 事件循環(huán)運(yùn)行異步函數(shù)。
get_event_loop()
方法檢查是否尚未調(diào)用 set_event_loop ,它將創(chuàng)建一個事件循環(huán)并將其設(shè)置為當(dāng)前。 語法是:
my_loop = asyncio.get_event_loop()
如果在循環(huán)已創(chuàng)建時再次執(zhí)行此命令,則它不會執(zhí)行任何操作。 但是,在第一次調(diào)用中,沒有創(chuàng)建循環(huán); 因此,它將創(chuàng)建一個異步循環(huán)。
如果 get_event_loop()
返回的循環(huán)是異步的,則 run_until_complete()
用于并發(fā)運(yùn)行事件循環(huán)。 語法是:
my_loop.run_until_complete(main())
如果主函數(shù)是異步的,則此語句將并發(fā)運(yùn)行代碼。
異步代碼
對運(yùn)行異步函數(shù)/例程/進(jìn)程所需的概念和 Python 庫有了清晰的認(rèn)識,是時候看一個完整的編碼示例了:
import asyncio async def fun_a(t): for i in range(t): print("fun_a", end=' ') await asyncio.sleep(1) return 1 async def fun_b(t): for i in range(t): print("fun_b", end=' ') await asyncio.sleep(1) return 2 async def main(): results = await asyncio.gather(fun_a(5), fun_b(5)) print(results) my_loop = asyncio.get_event_loop() my_loop.run_until_complete(main())
在這段代碼的頂部(第一行),我們導(dǎo)入了 asyncio 庫。 這個庫有一個調(diào)用異步函數(shù)并發(fā)運(yùn)行的必需函數(shù); 他們已經(jīng)用語法進(jìn)行了討論。
接下來,我們有兩個異步函數(shù)—— fun_a
和 fun_b
,我們希望它們同時運(yùn)行。 同樣,我們想從主函數(shù)調(diào)用異步函數(shù)。 因此,main 也被創(chuàng)建為一個異步函數(shù)。
另外,請注意我們將 5 傳遞給我們的函數(shù)以在其中運(yùn)行五次循環(huán)。 所以稍后,您可以看到輸出并得到循環(huán)沒有完全運(yùn)行的想法; 每個都進(jìn)入睡眠狀態(tài)并控制另一個功能。
我們將在輸出后重復(fù)這一點。
在 main 函數(shù)中,我們調(diào)用了 gather 函數(shù)并傳遞了我們的異步函數(shù),以便它們可以并行運(yùn)行。 gather 函數(shù)返回一個元組,它有兩個從我們的目標(biāo)異步函數(shù)返回的值。
我們終于來到了最后兩行。 在倒數(shù)第二行,我們調(diào)用了 get_event_loop 函數(shù)來創(chuàng)建一個循環(huán)。 在最后一行,使用我們的循環(huán),我們調(diào)用了 run_until_complete 函數(shù)來開始異步運(yùn)行我們的主函數(shù)。
此代碼的輸出是:
fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b [1, 2]
首先,請注意我們的循環(huán)并不完全像傳統(tǒng)代碼那樣運(yùn)行; 相反,兩個循環(huán)同時運(yùn)行。 您可以看到兩個函數(shù) print 語句的結(jié)果。
最后,[1, 2]
是主函數(shù)從我們的異步函數(shù)接收到的元組。 1 和 2 由我們的異步函數(shù)返回,并按照我們在 gather 函數(shù)中編寫這些函數(shù)的順序排列。
到此這篇關(guān)于Python 中的異步 for 循環(huán)的文章就介紹到這了,更多相關(guān)Python異步 for 循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python selenium+cookie實現(xiàn)免密登陸的示例代碼
本文主要介紹了Python selenium+cookie實現(xiàn)免密登陸的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Python實現(xiàn)的徑向基(RBF)神經(jīng)網(wǎng)絡(luò)示例
這篇文章主要介紹了Python實現(xiàn)的徑向基(RBF)神經(jīng)網(wǎng)絡(luò),結(jié)合完整實例形式分析了Python徑向基(RBF)神經(jīng)網(wǎng)絡(luò)定義與實現(xiàn)技巧,需要的朋友可以參考下2018-02-02讓python json encode datetime類型
python2.6+ 自帶的json模塊,不支持datetime的json encode,每次都需要手動轉(zhuǎn)為字符串,很累人,我們可以自己封裝一個簡單的方法處理此問題。2010-12-12簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程
這篇文章主要介紹了簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程,使用yield生成器函數(shù)進(jìn)行多進(jìn)程編程是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要知識,需要的朋友可以參考下2015-05-05選擇python進(jìn)行數(shù)據(jù)分析的理由和優(yōu)勢
在本篇文章中小編給大家整理了關(guān)于選擇python進(jìn)行數(shù)據(jù)分析的理由和優(yōu)勢,對此有需要的朋友們可以跟著學(xué)習(xí)參考下。2019-06-06