如何在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
.
.
.
登录后复制

方法1-使用线程

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

语法

thread1 = threading.Thread(target=async_function1)
登录后复制

示例

在下面的示例中,我们有两个异步函数:async_function1 和 async_function2。

  • async_function1 使用 time.sleep(1) 每秒打印“异步函数 1”。

  • async_function2 使用 time.sleep(2) 每两秒打印一次“Async function 2”。

我们创建两个线程,thread1 和 thread2,分别针对 async_function1 和 async_function2。线程模块中的 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) 每秒打印“异步函数 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 应用程序开辟了新的可能性。通过利用异步函数和事件循环,您可以利用并发的力量并有效地管理多个任务。

以上就是如何在Python中永远运行两个异步函数的详细内容,转载自php中文网

点赞(477) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部