asyncio库的基本介绍

766 阅读2分钟

asyncio 是 Python 的一个用于编写单线程并发代码的库,使用 async/await 语法。它是 Python 3.4 中引入的一个功能,主要用于解决异步IO编程的问题,也是 Python 中处理并发的一个重要方式。

以下是一些基本概念和用法:

  1. Coroutine(协程):在 Python 中,协程是一种特殊的函数,它可以在执行过程中挂起(yield),然后在之后的某个时间点再从挂起的地方继续执行。这种特性使得协程非常适合用于处理IO密集型任务。在 Python 中,协程函数用 async def 关键字定义,返回一个协程对象。

    async def foo():
        print('Running in coroutine')
    
  2. Event Loop(事件循环):事件循环是 asyncio 的核心。它负责调度并执行任务。你可以想象它是一个无限循环,不断检查和执行任务。

    import asyncio
    
    async def foo():
        print('Running in coroutine')
    
    # 创建事件循环
    loop = asyncio.get_event_loop()
    
    # 将协程添加到事件循环
    loop.run_until_complete(foo())
    
    # 关闭事件循环
    loop.close()
    
  3. Task(任务):任务是对协程对象的进一步封装,它提供了一些额外的功能,比如获取协程的执行结果,取消协程的执行等。在事件循环中执行协程时,通常会将协程封装成任务来执行。

    import asyncio
    
    async def foo():
        return 'Running in coroutine'
    
    # 创建任务
    task = asyncio.create_task(foo())
    
    # 获取任务结果
    print(task.result())
    
  4. Future(期程):期程是 asyncio 中的一个重要概念,它代表一个尚未完成的操作。当这个操作完成后,期程会存储其结果或者错误信息。你可以在期程完成后获取其结果,或者添加一个回调函数,在期程完成后自动执行。

    import asyncio
    
    async def foo():
        return 'Running in coroutine'
    
    loop = asyncio.get_event_loop()
    future = loop.create_future()
    
    # 绑定回调函数
    future.add_done_callback(lambda x: print('Done'))
    
    # 在协程中设置future的结果
    async def set_future_result():
        await asyncio.sleep(1)
        future.set_result('Future is done!')
    
    loop.run_until_complete(set_future_result())
    loop.close()
    
  5. async/await:这是定义和调用协程的关键字。async def 用于定义协程函数,await 用于在协程中等待另一个协程完成。

    import asyncio
    
    async def foo():
        await asyncio.sleep(1)
        print('Running in coroutine')
    
    asyncio.run(foo())
    
  6. gather和wait:这两个函数都用于在一个协程中等待多个协程完成。区别是,gather 会返回所有协程的结果,而 wait 只会返回完成的协程。

    import asyncio
    
    async def foo(n):
        await asyncio.sleep(n)
        return 'Done ' + str(n)
    
    # gather
    print(asyncio.run(asyncio.gather(foo(1), foo(2), foo(3))))
    
    # wait
    done, pending = asyncio.run(asyncio.wait([foo(1), foo(2), foo(3)]))
    print([task.result() for task in done])
    

这只是 asyncio 库的基本介绍,它还有很多其他的功能和用法。