異步函數(shù),也稱為協(xié)程,是在執(zhí)行過(guò)程中可以暫停和恢復(fù)的函數(shù)。在 Python 中,asyncio 模塊提供了一個(gè)強(qiáng)大的框架,用于使用協(xié)程編寫并發(fā)代碼,協(xié)程是可以暫停和恢復(fù)的特殊函數(shù)。在本文中,我們將探討如何在 Python 中使用 asyncio 永久運(yùn)行兩個(gè)異步函數(shù)。
異步函數(shù)
異步函數(shù),也稱為協(xié)程,是可以在執(zhí)行過(guò)程中暫停和恢復(fù)的函數(shù)。它們?cè)试S并發(fā)執(zhí)行代碼而不阻塞主線程,從而實(shí)現(xiàn)系統(tǒng)資源的高效利用。
要在 Python 中定義異步函數(shù),我們?cè)?def 語(yǔ)句之前使用 async 關(guān)鍵字。在異步函數(shù)中,我們可以使用await關(guān)鍵字暫停執(zhí)行并等待另一個(gè)異步函數(shù)或協(xié)程完成。
方法1-使用asyncio模塊
Python 中的 asyncio 模塊提供了一個(gè)框架,用于使用協(xié)程編寫單線程并發(fā)代碼、通過(guò)套接字和其他資源復(fù)用 I/O 訪問(wèn)、運(yùn)行網(wǎng)絡(luò)客戶端和服務(wù)器以及其他相關(guān)操作。它允許我們以結(jié)構(gòu)化和有組織的方式編寫異步代碼。
語(yǔ)法
Here, the asyncio.get_event_loop() function is used to retrieve the current event loop or create a new one if none exists.
登錄后復(fù)制
示例
在下面的 function1 示例中,我們有一個(gè)無(wú)限循環(huán),它打印“Function 1”,然后使用await asyncio.sleep(1) 暫停 1 秒。同樣,function2 有一個(gè)無(wú)限循環(huán),打印“Function 2”并暫停 2 秒。通過(guò)在主函數(shù)中調(diào)用 asyncio.gather(function1(), function2()),我們指示事件循環(huán)同時(shí)執(zhí)行這兩個(gè)函數(shù)。 asyncio.gather 函數(shù)負(fù)責(zé)以交錯(cuò)的方式調(diào)度和運(yùn)行這兩個(gè)函數(shù)。當(dāng)我們運(yùn)行 Python 腳本時(shí),事件循環(huán)無(wú)限期地運(yùn)行,重復(fù)執(zhí)行 function1 和 function2。輸出演示了這種行為,來(lái)自兩個(gè)函數(shù)的消息根據(jù)各自的時(shí)間間隔以交錯(cuò)方式打印。
import asyncio async def function1(): while True: print("Function 1") await asyncio.sleep(1) # Pause execution for 1 second async def function2(): while True: print("Function 2") await asyncio.sleep(2) # Pause execution for 2 seconds async def main(): await asyncio.gather(function1(), function2()) if __name__ == "__main__": loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.close()
登錄后復(fù)制
輸出
Function 1 Function 2 Function 1 Function 2 Function 1 Function 1 Function 2 Function 1 Function 1 . . .
登錄后復(fù)制
方法1-使用線程
線程是輕量級(jí)的,允許在單個(gè)進(jìn)程中并發(fā)執(zhí)行多個(gè)任務(wù)。在這個(gè)方法中,我們將利用線程模塊來(lái)永遠(yuǎn)運(yùn)行兩個(gè)異步函數(shù)。
語(yǔ)法
thread1 = threading.Thread(target=async_function1)
登錄后復(fù)制
示例
在下面的示例中,我們有兩個(gè)異步函數(shù):async_function1 和 async_function2。
async_function1 使用 time.sleep(1) 每秒打印“異步函數(shù) 1”。
async_function2 使用 time.sleep(2) 每?jī)擅氪蛴∫淮巍癆sync function 2”。
我們創(chuàng)建兩個(gè)線程,thread1 和 thread2,分別針對(duì) async_function1 和 async_function2。線程模塊中的 Thread 類用于創(chuàng)建和管理線程。然后我們使用 start() 方法啟動(dòng)兩個(gè)線程。這會(huì)在單獨(dú)的線程中啟動(dòng)異步函數(shù)的執(zhí)行,從而允許它們同時(shí)運(yùn)行。
import threading import time def async_function1(): while True: print("Async function 1") time.sleep(1) def async_function2(): while True: print("Async function 2") time.sleep(2) thread1 = threading.Thread(target=async_function1) thread2 = threading.Thread(target=async_function2) thread1.start() thread2.start() while True: pass
登錄后復(fù)制
輸出
此示例的輸出將連續(xù)每秒打印“Async function 1”,每?jī)擅氪蛴 癆sync function 2”。該代碼啟動(dòng)兩個(gè)線程,每個(gè)線程執(zhí)行其各自的異步函數(shù)。主線程通過(guò)無(wú)限循環(huán)保持活動(dòng)狀態(tài),以允許其他線程無(wú)限期地運(yùn)行。
Async function 1 Async function 1 Async function 2 Async function 1 Async function 1 Async function 2 Async function 1 Async function 1 Async function 2
登錄后復(fù)制登錄后復(fù)制
方法 3 – 使用子流程
子進(jìn)程是可以在 Python 程序中創(chuàng)建和管理的獨(dú)立進(jìn)程。在這個(gè)方法中,我們將使用 subprocess 模塊來(lái)永遠(yuǎn)運(yùn)行兩個(gè)異步函數(shù)。
語(yǔ)法
subprocess.Popen(args, bufsize=-1, executable=None)
登錄后復(fù)制
這里,
args(必需):該參數(shù)指定要執(zhí)行的命令。它可以是一個(gè)字符串或字符串序列。
bufsize:此參數(shù)表示用于 I/O 操作的緩沖區(qū)大小。默認(rèn)值為-1,表示使用系統(tǒng)默認(rèn)緩沖區(qū)大小。
bufsize:此參數(shù)表示用于 I/O 操作的緩沖區(qū)大小。默認(rèn)值為-1,表示使用系統(tǒng)默認(rèn)緩沖區(qū)大小。
示例
在此示例中,我們有兩個(gè)相同的異步函數(shù):async_function1 和 async_function2。
async_function1 使用 time.sleep(1) 每秒打印“異步函數(shù) 1”。
async_function2 使用 time.sleep(2) 每?jī)擅氪蛴∫淮巍癆sync function 2”。
我們使用 subprocess 模塊中的 subprocess.Popen 類創(chuàng)建子進(jìn)程,而不是線程。每個(gè)子進(jìn)程都是通過(guò)執(zhí)行運(yùn)行相應(yīng)異步函數(shù)的單獨(dú) Python 進(jìn)程來(lái)創(chuàng)建的。子進(jìn)程是使用 subprocess.Popen 構(gòu)造函數(shù)創(chuàng)建的,我們傳遞 Python 命令來(lái)執(zhí)行所需的函數(shù)。例如,[‘python’, ‘-c’, ‘from module import async_function1; async_function1()’] 從單獨(dú)的 Python 進(jìn)程運(yùn)行 async_function1。
import subprocess import time def async_function1(): while True: print("Async function 1") time.sleep(1) def async_function2(): while True: print("Async function 2") time.sleep(2) subprocess1 = subprocess.Popen(['python', '-c', 'from module import async_function1; async_function1()']) subprocess2 = subprocess.Popen(['python', '-c', 'from module import async_function2; async_function2()']) while True: pass
登錄后復(fù)制
輸出
此示例的輸出將連續(xù)每秒打印“Async function 1”,每?jī)擅氪蛴 癆sync function 2”。該代碼創(chuàng)建兩個(gè)子進(jìn)程,每個(gè)子進(jìn)程執(zhí)行其各自的異步函數(shù)。主進(jìn)程通過(guò)無(wú)限循環(huán)保持活動(dòng)狀態(tài),以允許子進(jìn)程無(wú)限期地運(yùn)行。
Async function 1 Async function 1 Async function 2 Async function 1 Async function 1 Async function 2 Async function 1 Async function 1 Async function 2
登錄后復(fù)制登錄后復(fù)制
結(jié)論
在本文中,我們討論了如何使用 Python 中的 asyncio 模塊在 Python 中永久運(yùn)行兩個(gè)異步函數(shù)。使用 asyncio 進(jìn)行異步編程為編寫高性能和響應(yīng)式 Python 應(yīng)用程序開辟了新的可能性。通過(guò)利用異步函數(shù)和事件循環(huán),您可以利用并發(fā)的力量并有效地管理多個(gè)任務(wù)。
以上就是如何在Python中永遠(yuǎn)運(yùn)行兩個(gè)異步函數(shù)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.xfxf.net其它相關(guān)文章!