Python 如何持续运行两个异步函数

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.

示例

在下面的示例中,对于函数1,我们有一个无限循环,打印”Function 1″,然后使用await asyncio.sleep(1)暂停1秒。类似地,函数2有一个无限循环,打印”Function 2″,并暂停2秒。通过在主函数中调用asyncio.gather(function1(), function2()),我们指示事件循环同时执行这两个函数。asyncio.gather函数负责调度和以交错的方式运行这两个函数。当我们运行Python脚本时,事件循环会无限期运行,反复执行函数1和函数2。输出展示了这种行为,根据各自的时间间隔,两个函数的消息以交错的方式打印出来。

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
.
.
.

方法1 – 使用线程

线程是轻量级的,并允许在单个进程中同时执行多个任务。在这个方法中,我们将利用线程模块来永远运行两个异步函数。

语法

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

输出

此示例的输出将每秒钟连续打印“异步函数1”,每两秒钟打印一次“异步函数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 (required): 此参数指定要执行的命令。它可以是一个字符串或字符串序列。

  • 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应用程序打开新的可能性。通过利用async函数和事件循环,您可以利用并发性的能力并高效地管理多个任务。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程