真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中asyncio如何使用

這篇文章給大家介紹Python中asyncio如何使用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)主要從事網(wǎng)站設計制作、成都做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務阿榮,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575

在Python中運行協(xié)程和任務

很自然,asyncio最常見的用途是運行Python腳本的異步部分。這意味著學會使用協(xié)程和任務。

Python的異步組件(包括協(xié)程和任務)只能與其他異步組件一起使用,不能與常規(guī)的同步Python一起使用,因此需要asyncio來填補缺口。為此,你要使用asyncio.run函數(shù):

import asyncio

async def main():

print ("Waiting 5 seconds. ")

for _ in range(5):

await asyncio.sleep(1)

print (".")

print ("Finished waiting.")

asyncio.run(main())

這運行main(),連同main()觸發(fā)的任何例程,等待結果返回。

通常而言,Python程序應只有一個.run()語句,就像Python程序應只有一個main()函數(shù)一樣。 如果不小心使用,async可能會使程序的控制流難以閱讀。程序的異步代碼只有一個入口點可以避免情況變得繁復。

異步函數(shù)還可以調(diào)度安排成tasks,即包裝協(xié)程并幫助運行協(xié)和的對象。

async def my_task():

do_something()

task = asyncio.create_task(my_task())

my_task()隨后在事件循環(huán)中運行,結果存儲在task中。

如果你只有一個任務想要獲取結果,可以使用asyncio.wait_for(task)來等待任務完成,然后使用task.result()檢索結果。但如果你安排了許多任務要執(zhí)行,并想要等待所有任務完成,不妨使用asyncio.wait([task1, task2])收集結果。(注意,如果你不希望超過一定長度的時間后運行,可以設置操作的超時時間。)

在Python中管理異步事件循環(huán)

asyncio的另一個常見用途是管理異步事件循環(huán)。事件循環(huán)是運行異步函數(shù)和回調(diào)的對象。使用asyncio.run()時,它自動創(chuàng)建。你通常希望每個程序僅使用一個異步事件循環(huán),同樣以便管理。

如果你在編寫服務器等更高級的軟件,需要對事件循環(huán)擁有較低級別的訪問權。為此,你可以“揭開面紗”,直接接觸事件循環(huán)的內(nèi)部機制。不過如果是簡單的工作,不需要這么做。

在Python中使用streams讀寫數(shù)據(jù)

async的最佳使用場景是長時間運行的網(wǎng)絡操作,其中應用程序可能阻止等待其他某個資源返回結果。為此,asyncio提供了streams,這是用于執(zhí)行網(wǎng)絡I/O的高級機制。這包括充當網(wǎng)絡請求的服務器。

asyncio使用兩個類StreamReader和StreamWriter,在高級層面進行網(wǎng)絡讀寫。如果你要從網(wǎng)絡讀取,可以使用asyncio.open_connection()打開連接。該函數(shù)返回StreamReader對象和StreamWriter對象的元組,你要在每個對象上使用.read() 和.write()方法以便通信。

想接收來自遠程主機的連接,使用asyncio.start_server()。asyncio.start_server()函數(shù)將回調(diào)函數(shù)client_connected_cb作為參數(shù)來接受,只要收到請求就調(diào)用該函數(shù)。該回調(diào)函數(shù)將StreamReader和StreamWriter的實例作為參數(shù),那樣你就能處理服務器的讀/寫邏輯。這個例子( https://gist.github.com/ethanfrey/75e58db27095936b9e5e )介紹了一個簡單的HTTP服務器使用asyncio驅動的aiohttp庫。

在Python中同步任務

異步任務往往獨立運行,但有時你希望它們彼此通信。asyncio提供了隊列和另外幾種在任務之間進行同步的機制:

隊列:asyncio隊列允許異步函數(shù)排列Python對象,以便供其他異步函數(shù)使用——比如說,基于行為在不同類型的函數(shù)之間分配工作負載。

同步原語:asyncio中的鎖、事件、條件和信號其工作方式類似常規(guī)的Python鎖、事件、條件和信號。

關于所有這些方法要記住的一點是它們不是線程安全的。對于在同一事件循環(huán)中運行的異步任務來說這不是問題。但如果你試圖與不同事件循環(huán)、操作系統(tǒng)線程或進程中的任務共享信息,就需要使用threading模塊及其對象來執(zhí)行此操作。

此外,如果你想跨線程邊界啟動協(xié)程,請使用asyncio.run_coroutine_threadsafe()函數(shù),然后將與它結合使用的事件循環(huán)作為參數(shù)傳遞。

在Python中暫停協(xié)程

asyncio的另一個常見、但很少討論的用途是在協(xié)程內(nèi)部等待任意時長。為此你不能使用time.sleep(),否則會阻塞整個程序。而是應使用asyncio.sleep(),它允許其他協(xié)程繼續(xù)運行。

在Python中使用較低級別的async

最后,如果你認為構建的應用程序可能需要asyncio的較低級組件,在開始編程之前先考慮一番:很可能有人已經(jīng)構建了可以滿足你需求的基于async的Python庫。

比如說,如果你需要異步DNS查詢,不妨查看aiodns庫;若是異步SSH會話,則有asyncSSH。通過關鍵字“async”(以及其他與任務相關的關鍵字)搜索PyPI,或查看人工篩選的Awesome Asyncio列表以獲取靈感。

關于Python中asyncio如何使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


網(wǎng)站題目:Python中asyncio如何使用
轉載來源:http://weahome.cn/article/pecopo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部