Python?異步之如何啟動(dòng)獲取事件循環(huán)
1. 什么是 Asyncio 事件循環(huán)
asyncio 程序的核心是事件循環(huán)。在本節(jié)中,我們將花點(diǎn)時(shí)間看一下 asyncio 事件循環(huán)
事件循環(huán)是用于在單個(gè)線程中執(zhí)行協(xié)程的環(huán)境。事件循環(huán)是異步程序的核心。
它做了很多事情,例如:
- 執(zhí)行協(xié)程。
- 執(zhí)行回調(diào)。
- 執(zhí)行網(wǎng)絡(luò)輸入/輸出。
- 運(yùn)行子進(jìn)程。
事件循環(huán)是一種常見(jiàn)的設(shè)計(jì)模式,并且由于在 JavaScript 中的使用而在最近變得非常流行。
事件循環(huán),顧名思義,就是一個(gè)循環(huán)。它管理一個(gè)任務(wù)列表(協(xié)同程序)并嘗試在循環(huán)的每次迭代中按順序推進(jìn)每個(gè)任務(wù),以及執(zhí)行其他任務(wù),如執(zhí)行回調(diào)和處理 I/O。
“asyncio”模塊提供了訪問(wèn)事件循環(huán)并與之交互的功能。這不是典型應(yīng)用程序開(kāi)發(fā)所必需的。
相反,為框架開(kāi)發(fā)人員提供了對(duì)事件循環(huán)的訪問(wèn),這些開(kāi)發(fā)人員希望在 asyncio 模塊之上構(gòu)建或?yàn)槠鋷?kù)啟用 asyncio。
asyncio 模塊提供了一個(gè)用于訪問(wèn)當(dāng)前事件循環(huán)對(duì)象的低級(jí) API,以及一套可用于與事件循環(huán)交互的方法。
低級(jí) API 適用于將 asyncio 擴(kuò)展、補(bǔ)充和集成到第三方庫(kù)中的框架開(kāi)發(fā)人員。我們很少需要與 asyncio 程序中的事件循環(huán)交互,而是使用高級(jí) API。
盡管如此,我們還是可以簡(jiǎn)單地探討一下如何獲取事件循環(huán)。
2. 如何啟動(dòng)和獲取事件循環(huán)
我們?cè)?asyncio 應(yīng)用程序中創(chuàng)建事件循環(huán)的典型方法是通過(guò) asyncio.run() 函數(shù)。該函數(shù)接受一個(gè)協(xié)程并將執(zhí)行它直到完成。我們通常將它傳遞給我們的主協(xié)程并從那里運(yùn)行我們的程序。有用于創(chuàng)建和訪問(wèn)事件循環(huán)的低級(jí)函數(shù)。asyncio.new_event_loop() 函數(shù)將創(chuàng)建一個(gè)新的事件循環(huán)并返回對(duì)它的訪問(wèn)。
... # create and access a new asyncio event loop loop = asyncio.new_event_loop()
我們可以用一個(gè)有效的例子來(lái)證明這一點(diǎn)。
在下面的示例中,我們將創(chuàng)建一個(gè)新的事件循環(huán),然后報(bào)告其詳細(xì)信息。
# SuperFastPython.com # example of creating an event loop import asyncio # create and access a new asyncio event loop loop = asyncio.new_event_loop() # report defaults of the loop print(loop)
運(yùn)行示例創(chuàng)建事件循環(huán),然后報(bào)告對(duì)象的詳細(xì)信息。我們可以看到,在這種情況下,事件循環(huán)的類型為 _UnixSelectorEventLoop 并且沒(méi)有運(yùn)行,但也沒(méi)有關(guān)閉。
<_UnixSelectorEventLoop running=False closed=False debug=False>
如果 asyncio 事件循環(huán)已經(jīng)在運(yùn)行,我們可以通過(guò) asyncio.get_running_loop() 函數(shù)訪問(wèn)它。
... # access he running event loop loop = asyncio.get_running_loop()
還有一個(gè)用于獲取或啟動(dòng)事件循環(huán)的函數(shù),稱為 asyncio.get_event_loop(),但它在 Python 3.10 中已棄用,不應(yīng)使用。
3. 什么是事件循環(huán)對(duì)象
事件循環(huán)作為 Python 對(duì)象實(shí)現(xiàn)。事件循環(huán)對(duì)象定義了事件循環(huán)的實(shí)現(xiàn)方式,并提供了與循環(huán)交互的通用 API,定義在 AbstractEventLoop 類中。不同平臺(tái)的事件循環(huán)有不同的實(shí)現(xiàn)。例如,Windows 和基于 Unix 的操作系統(tǒng)將以不同的方式實(shí)現(xiàn)事件循環(huán),因?yàn)樵谶@些平臺(tái)上實(shí)現(xiàn)非阻塞 I/O 的底層方式不同。
SelectorEventLoop 類型的事件循環(huán)是基于 Unix 的操作系統(tǒng)(如 Linux 和 macOS)的默認(rèn)設(shè)置。
ProactorEventLoop 類型的事件循環(huán)是 Windows 上的默認(rèn)設(shè)置。
第三方庫(kù)可能會(huì)實(shí)現(xiàn)自己的事件循環(huán)以針對(duì)特定功能進(jìn)行優(yōu)化。
4. 為什么要訪問(wèn)事件循環(huán)
為什么我們要訪問(wèn) asyncio 程序之外的事件循環(huán)?
我們可能希望從正在運(yùn)行的 asyncio 程序外部訪問(wèn)事件循環(huán)的原因有很多。
- 監(jiān)控任務(wù)的進(jìn)度。
- 發(fā)布任務(wù)并從中獲取結(jié)果。
- 解雇并忘記一次性任務(wù)。
asyncio 事件循環(huán)可以在程序中用作基于協(xié)程任務(wù)的線程池的替代方案。事件循環(huán)也可以嵌入到普通的 asyncio 程序中并根據(jù)需要訪問(wèn)。
以上就是Python 異步之如何啟動(dòng)獲取事件循環(huán)的詳細(xì)內(nèi)容,更多關(guān)于Python 異步事件循環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 簡(jiǎn)單理解Python中的事件循環(huán)EventLoop
- python Tornado事件循環(huán)示例源碼解析
- 在Python的一段程序中如何使用多次事件循環(huán)詳解
- python html2text庫(kù)將HTML文檔轉(zhuǎn)換為純文本格式使用示例探索
- python?Prophet時(shí)間序列預(yù)測(cè)工具庫(kù)使用功能探索
- Python flashtext文本搜索和替換操作庫(kù)功能使用探索
- python ftfy庫(kù)處理金融方面文件編碼錯(cuò)誤實(shí)例詳解
- python uvloop事件循環(huán)庫(kù)使用功能示例探究
相關(guān)文章
Python zip()函數(shù)用法實(shí)例分析
這篇文章主要介紹了Python zip()函數(shù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python zip()函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03
Python實(shí)現(xiàn)定時(shí)任務(wù)
本篇文章主要介紹了Python實(shí)現(xiàn)定時(shí)任務(wù),主要有5種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
Python實(shí)現(xiàn)PyPDF2處理PDF文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)PyPDF2處理PDF文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
python 實(shí)現(xiàn)的IP 存活掃描腳本
這篇文章主要介紹了python 實(shí)現(xiàn)的IP 存活掃描腳本,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
python中urllib.request和requests的使用及區(qū)別詳解
這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
快速解決vue.js 模板和jinja 模板沖突的問(wèn)題
今天小編就為大家分享一篇快速解決vue.js 模板和jinja 模板沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
使用TensorFlow創(chuàng)建生成式對(duì)抗網(wǎng)絡(luò)GAN案例
這篇文章主要為大家介紹了使用TensorFlow創(chuàng)建生成式對(duì)抗網(wǎng)絡(luò)GAN案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

