成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Python中的asyncio?

譯文
開發 后端
利用Python的asyncio庫中的高級異步函數,編寫更高效的Python應用程序。

[[315672]]

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

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

本文重點介紹高級API。我們會逐步介紹asyncio中常用的高級API,說明它們如何可用于涉及異步任務的常見操作。

如果你完全剛接觸Python中的async,或者想了解其工作原理,不妨先看看本人介紹Python async的文章:https://www.infoworld.com/article/3454442/get-started-with-async-in-python.html,之后再作深入研究。

在Python中運行協程和任務

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

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

  1. import asyncio  
  2. async def main():  
  3. print ("Waiting 5 seconds. " 
  4. for _ in range(5):  
  5. await asyncio.sleep(1)  
  6. print ("." 
  7. print ("Finished waiting." 
  8. asyncio.run(main()) 

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

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

異步函數還可以調度安排成tasks,即包裝協程并幫助運行協和的對象。 

  1. async def my_task():  
  2. do_something()  
  3. task = asyncio.create_task(my_task()) 

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

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

在Python中管理異步事件循環

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

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

在Python中使用streams讀寫數據

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

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

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

在Python中同步任務

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

  • 隊列:asyncio隊列允許異步函數排列Python對象,以便供其他異步函數使用——比如說,基于行為在不同類型的函數之間分配工作負載。
  • 同步原語:asyncio中的鎖、事件、條件和信號其工作方式類似常規的Python鎖、事件、條件和信號。

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

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

在Python中暫停協程

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

在Python中使用較低級別的async

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

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

原文標題:How to use asyncio in Python,作者:Serdar Yegulalp

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2017-08-02 15:00:12

PythonAsyncio異步編程

2017-05-05 08:44:24

PythonAsyncio異步編程

2024-01-18 08:37:33

socketasyncio線程

2023-07-14 15:10:17

PythonAsyncIO庫

2023-11-06 14:13:51

asyncio開發

2016-09-19 21:24:08

PythonAsyncio游戲

2016-09-14 21:17:47

PythonAsyncio游戲

2016-09-22 21:12:14

2014-03-31 10:51:40

pythonasyncio

2017-09-05 08:08:37

asyncio程序多線程

2021-08-01 15:26:59

協程Asyncio并發數

2022-11-17 07:57:34

2025-06-03 08:27:58

Python異步IO編程

2022-11-08 11:49:09

NLP庫Python云服務

2017-11-01 07:57:08

Python

2021-07-21 14:29:27

Python編程語言軟件開發

2010-03-15 17:26:58

Python字典

2018-10-08 15:35:56

Python異步IO

2023-08-30 08:43:42

asyncioaiohttp

2010-02-03 15:40:37

Python函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精选一区二区 | 中文字幕在线视频网站 | 91精品国产一区二区三区 | 亚洲一区二区av | 亚洲一区精品视频 | 国产综合精品 | 亚洲精品久久久久久久久久吃药 | 99r在线| 日韩精品一区二区三区在线观看 | 欧美日韩一区二区三区四区 | 黄色一级在线播放 | 欧美日韩亚洲国产综合 | 午夜影院黄 | 中文字幕亚洲视频 | 一级二级三级黄色 | 美女国内精品自产拍在线播放 | 国产美女在线播放 | 日韩在线不卡 | 亚洲国产精品一区二区三区 | 久久精品成人热国产成 | 2022精品国偷自产免费观看 | 色婷婷国产精品 | 全免费a级毛片免费看视频免 | av在线一区二区 | 四虎影院新网址 | av一二三区| 亚洲电影一区二区三区 | 亚洲国产成人精品女人久久久 | 视频一区二区在线观看 | 欧美国产精品久久久 | www日日日 | 夜夜夜夜夜夜曰天天天 | 国产精品毛片av | 一区二区三区视频在线观看 | 2018天天干天天操 | 一区二区久久电影 | 国产日韩一区二区 | 久久免费小视频 | 91新视频| 韩日一区二区三区 | 国产夜恋视频在线观看 |