日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python asyncio_如何使用Python中的asyncio?

發(fā)布時(shí)間:2024/7/5 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python asyncio_如何使用Python中的asyncio? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【51CTO.com快譯】Python的異步編程功能(簡(jiǎn)稱(chēng)async)讓你可以編寫(xiě)不必等待獨(dú)立任務(wù)完成就可以完成更多工作的程序。Python附帶的asyncio庫(kù)為你提供了使用async處理磁盤(pán)或網(wǎng)絡(luò)I/O、無(wú)需其他方面等待的工具。

asyncio提供了兩種處理異步操作的API:高級(jí)和低級(jí)。高級(jí)API用途廣泛,適用于各種應(yīng)用程序。低級(jí)API功能強(qiáng)大,但也很復(fù)雜,使用頻率較低。

本文重點(diǎn)介紹高級(jí)API。我們會(huì)逐步介紹asyncio中常用的高級(jí)API,說(shuō)明它們?nèi)绾慰捎糜谏婕爱惒饺蝿?wù)的常見(jiàn)操作。

在Python中運(yùn)行協(xié)程和任務(wù)

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

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

import asyncio

async def main():

print ("Waiting 5 seconds. ")

for_inrange(5):

await asyncio.sleep(1)

print (".")

print ("Finished waiting.")

asyncio.run(main())

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

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

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

async def my_task():

do_something()

task = asyncio.create_task(my_task())

my_task()隨后在事件循環(huán)中運(yùn)行,結(jié)果存儲(chǔ)在task中。

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

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

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

如果你在編寫(xiě)服務(wù)器等更高級(jí)的軟件,需要對(duì)事件循環(huán)擁有較低級(jí)別的訪(fǎng)問(wèn)權(quán)。為此,你可以“揭開(kāi)面紗”,直接接觸事件循環(huán)的內(nèi)部機(jī)制。不過(guò)如果是簡(jiǎn)單的工作,不需要這么做。

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

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

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

想接收來(lái)自遠(yuǎn)程主機(jī)的連接,使用asyncio.start_server()。asyncio.start_server()函數(shù)將回調(diào)函數(shù)client_connected_cb作為參數(shù)來(lái)接受,只要收到請(qǐng)求就調(diào)用該函數(shù)。該回調(diào)函數(shù)將StreamReader和StreamWriter的實(shí)例作為參數(shù),那樣你就能處理服務(wù)器的讀/寫(xiě)邏輯。這個(gè)例子(https://gist.github.com/ethanfrey/75e58db27095936b9e5e)介紹了一個(gè)簡(jiǎn)單的HTTP服務(wù)器使用asyncio驅(qū)動(dòng)的aiohttp庫(kù)。

在Python中同步任務(wù)

異步任務(wù)往往獨(dú)立運(yùn)行,但有時(shí)你希望它們彼此通信。asyncio提供了隊(duì)列和另外幾種在任務(wù)之間進(jìn)行同步的機(jī)制:

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

同步原語(yǔ):asyncio中的鎖、事件、條件和信號(hào)其工作方式類(lèi)似常規(guī)的Python鎖、事件、條件和信號(hào)。

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

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

在Python中暫停協(xié)程

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

在Python中使用較低級(jí)別的async

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

比如說(shuō),如果你需要異步DNS查詢(xún),不妨查看aiodns庫(kù);若是異步SSH會(huì)話(huà),則有asyncSSH。通過(guò)關(guān)鍵字“async”(以及其他與任務(wù)相關(guān)的關(guān)鍵字)搜索PyPI,或查看人工篩選的Awesome Asyncio列表(https://github.com/timofurrer/awesome-asyncio),以獲取靈感。

原文標(biāo)題:How to use asyncio in Python,作者:Serdar Yegulalp

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

【責(zé)任編輯:龐桂玉 TEL:(010)68476606】

點(diǎn)贊 0

總結(jié)

以上是生活随笔為你收集整理的python asyncio_如何使用Python中的asyncio?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。