Python中asyncio库的用法求助

从来没接触过编程的菜鸟,一路靠百度学习,现在遇到了一些问题,有些摸不着头脑,希望有大佬能给指一指路,下面是问题:
因为希望在处理返回数据的时候能够同时开始下一次请求,所以百度到了 asyncio 这个库,跟着教程写了一个很简单的例子,但是使用 run_until_complete 来注册协程到事件里去的时候,就会报“循环已经在运行”这个错,我也找不到原因,只能发帖求助
我的操作系统是 win7 64 位,python3.6,是用 anaconda 装的,写代码用的自带的 jupyter,先谢过各位了
Python中asyncio库的用法求助

2 回复

asyncio 是 Python 处理并发编程的核心库,主要用来写单线程的异步代码。核心就三个东西:协程(Coroutine)事件循环(Event Loop)任务(Task)

简单来说,你用 async def 定义一个协程函数,它内部用 await 去调用其他异步操作(比如网络请求、文件IO)。光定义协程不会执行,你需要把它扔给事件循环去跑。创建任务(asyncio.create_task())就是把协程包装成任务,让事件循环可以调度它。

看个最基础的例子,模拟两个并发的网络请求:

import asyncio
import time

async def fetch_data(task_name, delay):
    """模拟一个耗时的网络请求"""
    print(f"{task_name}: 开始请求,大约需要 {delay} 秒")
    await asyncio.sleep(delay)  # 模拟网络IO,这里不会阻塞线程
    print(f"{task_name}: 请求完成!")
    return f"{task_name} 的结果"

async def main():
    # 创建两个任务,它们会并发执行
    task1 = asyncio.create_task(fetch_data("任务A", 2))
    task2 = asyncio.create_task(fetch_data("任务B", 1))

    # 等待两个任务都完成,并获取结果
    result1 = await task1
    result2 = await task2

    print(f"\n所有任务完成。结果:{result1}, {result2}")

# Python 3.7+ 的启动方式
asyncio.run(main())

关键点解释:

  1. async def:声明一个异步函数(协程)。
  2. await:挂起当前协程,直到后面的 awaitable 对象(比如另一个协程、Task、Future)完成。在等待期间,事件循环可以去执行其他任务,这就是“异步”不阻塞的关键。
  3. asyncio.create_task():将协程包装成一个 Task 对象,并立即提交给事件循环进行调度。这是实现并发的常用方法。
  4. asyncio.run(main()):运行主协程,管理事件循环。这是 Python 3.7 之后推荐的入口。

一个常见的坑: 在异步函数里不要用同步的阻塞操作(比如 time.sleep(2)),这会把整个线程卡住。要用异步版本的 await asyncio.sleep(2)

再给个更实用的例子,用 asyncio.gather() 同时运行一堆任务:

async def main():
    # 同时发起多个请求,等全部完成
    results = await asyncio.gather(
        fetch_data("请求1", 3),
        fetch_data("请求2", 1),
        fetch_data("请求3", 2),
    )
    print(f"所有结果:{results}")

总结: 先理解 async/await 和事件循环模型,然后多用 create_taskgather 来组织并发。


木有人知道嘛

回到顶部