如何使用asyncio编写异步程序?

ps:程序结构都给你了!具体API不知道意思就去google吧!本人实际写过3和4两种形式的异步程序。laugh

1、运行协程的两种方式

在异步编程中,通常会有一个主协程函数,负责协调和调度其他协程任务。在以前的版本中,通常使用 asyncio.get_event_loop().run_until_complete(main()) 来运行主协程函数。这个方法在主协程函数执行完成后会自动关闭事件循环。

而在 Python 3.7 中引入了 asyncio.run() 方法,它是一个更简洁的替代方法,用于运行主协程函数。asyncio.run(main()) 会自动创建一个新的事件循环,运行指定的主协程函数,然后在主协程函数执行完成后自动关闭事件循环。这样可以减少异步编程中的一些常见问题,如事件循环的泄漏等。

2、多进程+异步程序的一种结构:以asyncio.run()运行协程

主协程:main_coroutine

import asyncio
import multiprocessing

async def worker_coroutine():
    # 协程任务的逻辑
    pass

async def main_coroutine():
    # 创建并发执行的协程任务列表
    tasks = [worker_coroutine() for _ in range(5)]

    # 并发执行协程任务
    await asyncio.gather(*tasks)

def process_worker():
    asyncio.run(main_coroutine())

if __name__ == "__main__":
    # 创建多个子进程
    processes = [multiprocessing.Process(target=process_worker) for _ in range(3)]

    # 启动子进程
    for process in processes:
        process.start()

    # 等待子进程结束
    for process in processes:
        process.join()

3、多进程+异步程序的一种结构:以run_until_complete运行协程

import asyncio
import multiprocessing

async def worker_coroutine():
    # 协程任务的逻辑
    pass

def process_worker():
    # 在子进程中创建新的事件循环
    loop = asyncio.new_event_loop()
    # 将loop设置为当前事件循环
    asyncio.set_event_loop(loop)

    # 并发运行协程任务
    tasks = [worker_coroutine() for _ in range(5)]
    try:
        loop.run_until_complete(asyncio.gather(*tasks))
       finally:
        loop.close()

if __name__ == "__main__":
    # 创建多个子进程
    processes = [multiprocessing.Process(target=process_worker) for _ in range(3)]

    # 启动子进程
    for process in processes:
        process.start()

    # 等待子进程结束
    for process in processes:
        process.join()

3.1 在子进程中可以用asyncio.get_event_loop()吗?

在多进程中,使用 asyncio.new_event_loop()asyncio.set_event_loop() 的组合通常更安全,因为它确保在每个子进程中都有一个独立的事件循环。

使用 asyncio.get_event_loop() 会返回主进程中的事件循环,但在多进程环境中,主进程和子进程共享同一个事件循环,这可能会导致意外的行为和竞争条件。

因此,为了避免潜在的并发问题,最好在每个子进程中都创建一个新的事件循环,然后在其中运行协程任务。

4、单进程+异步程序的一种结构:以asyncio.run()运行协程

import asyncio

async def coroutine_task():
    # 异步任务的逻辑
    await asyncio.sleep(1)
    print("Coroutine task completed")

async def main():
    # 创建并发执行的异步任务列表
    tasks = [coroutine_task() for _ in range(3)]

    # 并发执行异步任务
    await asyncio.gather(*tasks)

if __name__ == "__main__":
    # 运行主事件循环
    asyncio.run(main())

发表评论

评论列表,共 0 条评论

    暂无评论