亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python使用Asyncio進行web編程方法詳解

 更新時間:2022年08月05日 15:34:53   作者:宇宙之一粟  
這篇文章主要為大家介紹了Python使用Asyncio進行web編程的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

許多 Web 應用依賴大量的 I/O (輸入/輸出) 操作,比如從網站上下載圖片、視頻等內容;進行網絡聊天或者針對后臺數據庫進行多次查詢。數據庫查詢可能會耗費大量時間,尤其是在該數據庫處于高負載或查詢很復雜的情況下。 Web 服務器可能需要同時處理數百或數千個請求。

I/O 是指計算機的輸入和輸出設備,例如鍵盤、硬盤驅動器,以及最常見的網卡。這些操作等待用戶輸入或從基于 Web 的 API 檢索內容。

Asynchronous IO (async IO) 是一種異步編程設計,并在 Python 3.4 的 asyncio 模塊中得到了支持,作為在多線程和多進程之外處理這些高并發(fā)工作負載的另一種方法,可以顯著提高使用 I/O 操作的應用程序的性能和資源利用率。

什么是同步編程

同步編程,通常來說,大多數編程語言都是子例程調用模型:按照順序運行代碼。在此模型中,下一行代碼在前一行代碼完成后立即運行,并且一次只完成一個模塊。

該模型適用于大部分應用程序。但是,也存在明顯的缺點,如果一行代碼特別慢怎么辦?

在這種情況下,速度慢的代碼將導致所有其他代碼都將被卡住,直到該行完成。最差的情況下可能導致整個應用程序卡死??赡艽蠖鄶等嗽谀承┸浖僮髦校粋€小小的操作導致整個系統(tǒng)執(zhí)行不下去,最后只能重啟。

什么是異步編程

為了解決同步模型的問題,引入了異步編程的概念,意味著允許同一時刻執(zhí)行多個任務。

異步編程模型意味著需要長時間運行的任務可以在后臺運行,與主應用程序分開。系統(tǒng)可以自由地執(zhí)行不依賴于該任務的其他工作,而不是阻止所有其他應用程序代碼等待該長時間運行的任務完成。然后,一旦長時間運行的任務完成,我們會收到通知它已完成。

asyncio 庫允許我們使用異步編程模型運行代碼。 這讓我們可以一次處理多個 I/O 操作,同時仍然允許我們的應用程序保持響應。

在 Python 3.4 中,asyncio 庫中包含了裝飾器和生成器 yield from 來定義協程(coroutine)。協程是一種方法,當我們有一個可能長時間運行的任務時可以暫停,然后在該任務完成時恢復。

協程執(zhí)行完成后返回到調用者有一種新方法:通過 yield 控制。當協程的 yield 執(zhí)行完成后立即回到了調用點,但是對協程的再次調用不會在起始處再次開始,相反,他們繼續(xù)從最近停止處繼續(xù)進行。

如下圖所示:

def filter_even(numbers):
    for num in range(numbers):
        if (num % 2 == 0):
            yield num
even_number = filter_even(100)
print(list(even_number))

運行結果:

$ python yielddemo.py 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]

ayncio 版 Hello 程序

Python 3.5 版中,當關鍵字 async 和 await 顯式添加到語言中時,該語言實現了對協程和異步編程的一流支持。 這種語法在 C# 和 JavaScript 等其他編程語言中很常見,它允許我們使異步代碼看起來像是同步運行的。 這使得異步代碼易于閱讀和理解,因為它看起來像大多數軟件工程師熟悉的順序流程。 asyncio 是一個使用稱為單線程事件循環(huán)的并發(fā)模型以異步方式執(zhí)行這些協程的庫。

利用 async/await 兩個定義關鍵字定義協程,通過 asyncio 提供運行和管理協程的基礎:

import asyncio
import time
async def main():
    print(f'{time.ctime()} Hello!')
    await asyncio.sleep(1.0)
    print(f'{time.ctime()} See you again!')
asyncio.run(main())

運行結果:

$ python asynciodemo.py 
Sat Jul  9 23:19:40 2022 Hello!
Sat Jul  9 23:19:41 2022 See you again!

asyncio 提供了一個 run() 函數來執(zhí)行 async def 函數,然后從那里調用的所有其他協程,如 main() 函數中的 sleep() 函數。asyncio 不是多線程或多進程,而是并行運行代碼。

JavaScript 中支持異步執(zhí)行(瀏覽器,Nodejs,Electron 等)。在早期版本中,他們只是使用回調功能在異步操作完成后運行其他功能。

如何使用 asyncio

創(chuàng)建協程很簡單,與創(chuàng)建普通的 Python 函數沒有太大區(qū)別。唯一的區(qū)別是,我們不是使用 def 關鍵字,而是 使用 async def 。async 關鍵字將函數標記為協程,而不是普通的 Python 函數。

import asyncio
import time
def write(msg):
    print(msg, flush=True)
async def say1():
    await asyncio.sleep(1)
    write("Hello from 1")
async def say2():
    await asyncio.sleep(1)
    write("Hello from 2")
write("start")
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
    say1(),
    say2()
))
write("exit")
loop.close()

運行該代碼,可以看到 Hello from 1 運行 1 秒后運行 Hello from 2

$ python asyncoidemo2.py 
start
Hello from 1
Hello from 2
exit

run_until_complete 運行 say() 函數,解釋器會逐行執(zhí)行該函數的內容。當碰到 await 之后,解釋器開始異步操作:這個操作為了循環(huán)將完成一些內部回調操作,這個回調操作是對開發(fā)人員隱藏的。但是現在,say1 開始后,它立即將控制返回到事件循環(huán)。所以,它啟動異步 sleep 和控制循環(huán),然后循環(huán)實際上已經開始啟動 say2 函數。

當第一次異步 sleep 運行 1秒后,進入內部回調執(zhí)行 say1 協程,下一個操作是打印 Hello from 1。打印后,它再次返回到活動循環(huán)。同時,從第二次睡眠開始,循環(huán)獲得了有關完成第二次睡眠的事件。

所以接下來 Hello from 2 打印,然后第二種方法也返回。

run_until_complete(gather(l1,l2,l3)) 將阻止所有 l1,l2,l3 Coroutines:

請注意,7 和 9 事件可能會交換 - 如果您多次運行代碼,您可能會注意到 Hello from 1 打印在 Hello from 2 之后。

  • event_loop 事件循環(huán):程序開啟一個無限循環(huán),把一些函數注冊到事件循環(huán)上,當滿足事件發(fā)生的時候,調用相應的協程函數
  • coroutine 協程:協程對象,指一個使用 async 關鍵字定義的函數,它的調用不會立即執(zhí)行函數,而是會返回一個協程對象。協程對象需要注冊到事件循環(huán),由事件循環(huán)調用。
  • task 任務:一個協程對象就是一個原生可以掛起的函數,任務則是對協程進一步封裝,其中包含了任務的各種狀態(tài)
  • future: 代表將來執(zhí)行或沒有執(zhí)行的任務的結果。它和 task 上沒有本質上的區(qū)別
  • async/await 關鍵字:python3.5 用于定義協程的關鍵字,async 定義一個協程,await 用于掛起阻塞的異步調用接口。

總結

本文首先介紹了同步編程和異步編程的概念,然后引出了協程的基本概念,寫了 asyncio 版的 HelloWorld 程序,最后給出了 Python 中 asyncio 庫的簡易使用方法。

協程的優(yōu)勢在于多 IO 操作時能夠有效提高程序速度,例如某些 HTTP 客戶端,例如 aiohttps 調用服務器中就利用上了 asyncio 庫。

參考鏈接:Async IO in Python: A Complete Walkthrough

以上就是Python使用Asyncio進行web編程方法詳解的詳細內容,更多關于Python Asyncio web編程的資料請關注腳本之家其它相關文章!

相關文章

  • python實現楊輝三角思路

    python實現楊輝三角思路

    本文給大家分享的是作者使用python實現楊輝三角的思路,非常的實用,有需要的小伙伴可以參考下
    2017-07-07
  • python實戰(zhàn)之PyQt5實現漫畫臉

    python實戰(zhàn)之PyQt5實現漫畫臉

    本文詳細講解了python實戰(zhàn)之PyQt5實現漫畫臉的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • 使用Python將語音轉換為文本的方法

    使用Python將語音轉換為文本的方法

    這篇文章主要介紹了如何使用Python將語音轉換為文本,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Python3實現旋轉數組的3種算法小結

    Python3實現旋轉數組的3種算法小結

    旋轉數組是一種常見的數據結構問題,通常是指一個有序數組經過旋轉后,使得所有元素逆序排列,本文主要介紹了Python3實現旋轉數組的3種算法小結,感興趣的可以了解一下
    2023-12-12
  • Python利用PyPDF2庫實現輕松提取PDF文本

    Python利用PyPDF2庫實現輕松提取PDF文本

    ython中的PyPDF2庫是一個非常有用的工具,無論您是需要分析PDF文檔中的內容還是需要在文檔中搜索特定的信息,PyPDF2都可以幫助您輕松實現這些任務,下面我們就來學習一下如何利用PyPDF2提取PDF文本吧
    2023-09-09
  • Python?十個字典用法使用技巧歸納

    Python?十個字典用法使用技巧歸納

    今天小編幫大家簡單介紹下Python的一種數據結構:?字典,字典是一種可變容器模型,且可存儲任意類型對象,它用于存放具有映射關系的數據,這里介紹歸納十個字典的用法技巧,需要的朋友可以參考下
    2022-01-01
  • Python Django2 model 查詢介紹(條件、范圍、模糊查詢)

    Python Django2 model 查詢介紹(條件、范圍、模糊查詢)

    這篇文章主要介紹了Python Django2 model 查詢介紹(條件、范圍、模糊查詢),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python迭代器與生成器基本用法分析

    Python迭代器與生成器基本用法分析

    這篇文章主要介紹了Python迭代器與生成器基本用法,結合實例形式分析了Python迭代器與生成器的基本功能、定義及使用方法,需要的朋友可以參考下
    2018-07-07
  • Python批量按比例縮小圖片腳本分享

    Python批量按比例縮小圖片腳本分享

    這篇文章主要介紹了Python批量按比例縮小圖片腳本分享,本文直接給出實現代碼,需要的朋友可以參考下
    2015-05-05
  • pytest官方文檔解讀fixtures的autouse

    pytest官方文檔解讀fixtures的autouse

    這篇文章主要為大家介紹了pytest官方文檔解讀fixtures的autouse,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論