如何在 Python 中永遠執行兩個非同步函式


非同步函式,也稱為協程,是在執行過程中可以暫停和恢復的函式。在 Python 中,asyncio 模組提供了一個強大的框架,用於使用協程編寫併發程式碼,協程是可以在執行過程中暫停和恢復的特殊函式。在本文中,我們將探討如何在 Python 中使用 asyncio 永遠執行兩個非同步函式。

非同步函式

非同步函式,也稱為協程,是在執行過程中可以暫停和恢復的函式。它們允許併發執行程式碼而不會阻塞主執行緒,從而能夠有效利用系統資源。

要在 Python 中定義非同步函式,我們在 def 語句之前使用 async 關鍵字。在非同步函式中,我們可以使用 await 關鍵字暫停執行並等待另一個非同步函式或協程完成。

方法 1 - 使用 asyncio 模組

Python 中的 asyncio 模組提供了一個框架,用於使用協程編寫單執行緒併發程式碼,透過套接字和其他資源多路複用 I/O 訪問,執行網路客戶端和伺服器以及其他相關操作。它允許我們以結構化和組織化的方式編寫非同步程式碼。

語法

Here, the asyncio.get_event_loop() function is used to retrieve the current event loop or create a new one if none exists.

示例

在下面的 function1 示例中,我們有一個無限迴圈,列印“Function 1”,然後使用 await asyncio.sleep(1) 暫停 1 秒。類似地,function2 有一個無限迴圈,列印“Function 2”並暫停 2 秒。透過在主函式中呼叫 asyncio.gather(function1(), function2()),我們指示事件迴圈併發執行這兩個函式。asyncio.gather 函式負責以交錯方式排程和執行這兩個函式。當我們執行 Python 指令碼時,事件迴圈無限期執行,重複執行 function1 和 function2。輸出演示了此行為,來自這兩個函式的訊息根據其各自的時間間隔以交錯方式列印。

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()

輸出

Function 1
Function 2
Function 1
Function 2
Function 1
Function 1
Function 2
Function 1
Function 1
.
.
.

方法 2 - 使用執行緒

執行緒是輕量級的,允許在單個程序內併發執行多個任務。在這種方法中,我們將使用 threading 模組永遠執行兩個非同步函式。

語法

thread1 = threading.Thread(target=async_function1)

示例

在下面的示例中,我們有兩個非同步函式:async_function1 和 async_function2。

  • async_function1 使用 time.sleep(1) 每秒列印“Async function 1”。

  • async_function2 使用 time.sleep(2) 每兩秒列印“Async function 2”。

我們建立兩個執行緒,thread1 和 thread2,分別針對 async_function1 和 async_function2。threading 模組中的 Thread 類用於建立和管理執行緒。然後,我們使用 start() 方法啟動這兩個執行緒。這將在單獨的執行緒中啟動非同步函式的執行,允許它們併發執行。

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

輸出

此示例的輸出將持續每秒列印“Async function 1”和每兩秒列印“Async function 2”。程式碼啟動兩個執行緒,每個執行緒執行其各自的非同步函式。主執行緒透過無限迴圈保持活動狀態,以允許其他執行緒無限期執行。

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

方法 3 - 使用子程序

子程序是可以在 Python 程式中建立和管理的獨立程序。在這種方法中,我們將使用 subprocess 模組永遠執行兩個非同步函式。

語法

subprocess.Popen(args, bufsize=-1, executable=None)

這裡,

  • args(必需):此引數指定要執行的命令。它可以是字串或字串序列。

  • bufsize:此引數表示用於 I/O 操作的緩衝區大小。預設值為 -1,表示使用系統預設緩衝區大小。

  • bufsize:此引數表示用於 I/O 操作的緩衝區大小。預設值為 -1,表示使用系統預設緩衝區大小。

示例

在此示例中,我們有兩個相同的非同步函式:async_function1 和 async_function2。

  • async_function1 使用 time.sleep(1) 每秒列印“Async function 1”。

  • async_function2 使用 time.sleep(2) 每兩秒列印“Async function 2”。

我們不是使用執行緒,而是使用 subprocess 模組中的 subprocess.Popen 類建立子程序。每個子程序都是透過執行一個單獨的 Python 程序來建立的,該程序執行相應的非同步函式。子程序是使用 subprocess.Popen 建構函式建立的,我們傳遞 Python 命令來執行所需的函式。例如,['python', '-c', 'from module import async_function1; async_function1()'] 從單獨的 Python 程序執行 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

輸出

此示例的輸出將持續每秒列印“Async function 1”和每兩秒列印“Async function 2”。程式碼建立兩個子程序,每個子程序執行其各自的非同步函式。主程序透過無限迴圈保持活動狀態,以允許子程序無限期執行。

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

結論

在本文中,我們討論瞭如何透過使用 Python 中的 asyncio 模組在 Python 中永遠執行兩個非同步函式。使用 asyncio 進行非同步程式設計為編寫高效能和響應式 Python 應用程式開闢了新的可能性。透過利用非同步函式和事件迴圈,您可以利用併發的強大功能並有效地管理多個任務。

更新於: 2023年7月18日

9K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告