Python?中的異步?for?循環(huán)示例詳解
本篇文章將提供有關(guān) Python 中異步 for 循環(huán)的完整詳細信息。 我們將討論異步函數(shù)、異步 for 循環(huán)和睡眠概念。
接下來,我們將討論 Python 庫 asyncio 和運行異步代碼所需的函數(shù)。 最后,我們將看到幾個 Python 示例,以充分理解這個概念。
Python 中的異步函數(shù)
異步函數(shù)有助于與同一程序的其他函數(shù)并行運行繁重的任務(如批處理程序,也許我們對在后臺運行進程感興趣)。 當函數(shù)不相互依賴或不完全相互依賴時,可以并行運行函數(shù)。
同步函數(shù)在任務完成后返回控制權(quán),而異步函數(shù)返回控制權(quán)以并行運行其他函數(shù)/代碼并在一段時間后取回控制權(quán)。 這樣,不僅完成了繁重的任務,還并行完成了許多其他任務。
從技術(shù)上講,同步函數(shù)會阻塞主函數(shù)的控制,而異步函數(shù)的執(zhí)行不會阻塞主函數(shù)。 這樣,主函數(shù)可以并行運行多個異步函數(shù)。
Python 中的異步 for 循環(huán)
對于同步循環(huán),它們在沒有任何暫停/給予控制的情況下執(zhí)行; 但是,要使它們異步,我們必須在一些異步函數(shù)中定義它們。 此外,我們需要在這個過程中休眠一段時間,以控制其他一些功能。
使用睡眠語句
進程/線程/函數(shù)可能會休眠一段時間; 你可以考慮休息一下。 但是,目的是在一段時間內(nèi)失去控制。
結(jié)果,其他一些功能獲得了控制權(quán)。 一段時間后,控制返回,功能恢復。
現(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)的進程/函數(shù)。
該函數(shù)通過 await 關(guān)鍵字自愿離開 CPU 去執(zhí)行另一個協(xié)作任務。 睡眠函數(shù)的語法是:
await asyncio.sleep(1)
await 關(guān)鍵字將控制權(quán)返回給事件循環(huán)。 您可能會考慮,如果使用 await 命令調(diào)用異步函數(shù),則 sleep 語句(在 for 循環(huán)內(nèi))控制協(xié)作進程直到睡眠。
gather 函數(shù)將多個協(xié)作進程(技術(shù)上稱為協(xié)程)組合起來作為一個單元運行。 此函數(shù)按照在 gather 調(diào)用中編寫的函數(shù)的順序返回結(jié)果元組。
語法是:
results = await asyncio.gather(fun_a(5), fun_b(5))
在這里,我們正在制作 fun_a 和 fun_b 的管道,以便它們可以同時運行。
事件循環(huán)是每個異步應用程序的主要組成部分。 事件循環(huán)運行異步函數(shù)。
get_event_loop() 方法檢查是否尚未調(diào)用 set_event_loop ,它將創(chuàng)建一個事件循環(huán)并將其設置為當前。 語法是:
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ā)運行事件循環(huán)。 語法是:
my_loop.run_until_complete(main())
如果主函數(shù)是異步的,則此語句將并發(fā)運行代碼。
異步代碼
對運行異步函數(shù)/例程/進程所需的概念和 Python 庫有了清晰的認識,是時候看一個完整的編碼示例了:
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())在這段代碼的頂部(第一行),我們導入了 asyncio 庫。 這個庫有一個調(diào)用異步函數(shù)并發(fā)運行的必需函數(shù); 他們已經(jīng)用語法進行了討論。
接下來,我們有兩個異步函數(shù)—— fun_a 和 fun_b,我們希望它們同時運行。 同樣,我們想從主函數(shù)調(diào)用異步函數(shù)。 因此,main 也被創(chuàng)建為一個異步函數(shù)。
另外,請注意我們將 5 傳遞給我們的函數(shù)以在其中運行五次循環(huán)。 所以稍后,您可以看到輸出并得到循環(huán)沒有完全運行的想法; 每個都進入睡眠狀態(tài)并控制另一個功能。
我們將在輸出后重復這一點。
在 main 函數(shù)中,我們調(diào)用了 gather 函數(shù)并傳遞了我們的異步函數(shù),以便它們可以并行運行。 gather 函數(shù)返回一個元組,它有兩個從我們的目標異步函數(shù)返回的值。
我們終于來到了最后兩行。 在倒數(shù)第二行,我們調(diào)用了 get_event_loop 函數(shù)來創(chuàng)建一個循環(huán)。 在最后一行,使用我們的循環(huán),我們調(diào)用了 run_until_complete 函數(shù)來開始異步運行我們的主函數(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)代碼那樣運行; 相反,兩個循環(huá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)文章
Django JWT Token RestfulAPI用戶認證詳解
這篇文章主要介紹了Django JWT Token RestfulAPI用戶認證詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
Python環(huán)境搭建過程從安裝到Hello World
這篇文章主要介紹了Python環(huán)境搭建過程從安裝到Hello World,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
Django使用list對單個或者多個字段求values值實例
這篇文章主要介紹了Django使用list對單個或者多個字段求values值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
pytorch dataloader 取batch_size時候出現(xiàn)bug的解決方式
今天小編就為大家分享一篇pytorch dataloader 取batch_size時候出現(xiàn)bug的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
django 刪除數(shù)據(jù)庫表后重新同步的方法
今天小編就為大家分享一篇django 刪除數(shù)據(jù)庫表后重新同步的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

