asyncio异步教程详解

异步的核心技术描述


装饰器------装饰器的核心在于“函数”作为参数传入到函数之中,从而实现对于函数的动态修改
yeild-------python异步的核心关键字
协程-------协程的关键在于装饰器这种思想和yeild的这个关键字
asyncio和aiohttp 本质上就是装饰器,通过装饰器使函数成为协程,实现代码代码的异步

 

 

异步编程是一种能够帮助我们提高程序性能的编程模式。Python中的异步编程模块是asyncio,它在Python 3.4中被引入并在Python 3.5中得到了极大的改进。asyncio基于协程(coroutine)实现,协程是一种特殊的迭代器,可以在不切换线程或进程的情况下实现异步操作。

asyncio可以帮助我们实现如下类型的任务:

  • 异步I/O操作,如读写磁盘、连接数据库、调用Web API等;
  • 任务(task)的并发执行,如同时从多个网站爬取数据;
  • 超时管理;
  • 扩展性,可以方便地加入其他的异步框架。

异步I/O操作

在Python中,我们一般会使用多线程或多进程来实现I/O操作的并发执行。但是使用多线程或多进程会使得程序变得复杂,而且还有可能会出现死锁、竞争等问题。使用asyncio可以避免这些问题。

下面是使用asyncio进行异步I/O操作的例子:


import asyncio
async def main():
    await asyncio.sleep(1)
    print('Hello, world!')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

这个程序中,我们定义了main函数,该函数使用了async关键字,表示它是一个协程。在main函数中,我们使用了await关键字来等待1秒钟。程序最后输出了“Hello, world!”。

我们通过调用asyncio.get_event_loop()来获取事件循环(event loop)对象,然后调用它的run_until_complete()方法来运行main函数。run_until_complete()方法将会一直运行,直到main函数执行完毕。在main函数执行期间,事件循环会处理所有的I/O操作。

异步任务的并发执行

在异步编程中,执行异步操作的函数被称作协程函数,我们可以定义多个协程函数,然后通过事件循环来并发执行它们。

下面是一个并发执行两个协程函数的例子:


import asyncio
async def coro1():
    await asyncio.sleep(1)
    print('Coro1')
async def coro2():
    await asyncio.sleep(2)
    print('Coro2')
async def main():
    tasks = [coro1(), coro2()]
    await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在这个例子中,我们定义了两个协程函数coro1()和coro2(),它们分别延迟1秒钟和2秒钟后输出相应的字符串。在main函数中,我们定义了一个任务列表,包含了两个协程,然后使用asyncio.gather()函数来并行执行这两个协程。

超时管理

在异步编程中,我们有时需要设置超时时间,以避免一些操作持续时间过长而导致程序的崩溃。asyncio提供了asyncio.wait_for()函数来实现超时管理。

下面是一个设置超时时间的例子:


import asyncio
async def coro():
    await asyncio.sleep(5)
    print('Done')
async def main():
    try:
        await asyncio.wait_for(coro(), timeout=3)
    except asyncio.TimeoutError:
        print('Timeout')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在这个例子中,我们定义了一个coro()函数,它会延迟5秒后输出字符串。在main函数中,我们使用asyncio.wait_for()函数来调用coro()函数,并设置了3秒钟的超时时间。如果coro()函数的执行时间超过3秒钟,将会引发asyncio.TimeoutError异常。

扩展性

在一些情况下,我们可能需要将asyncio与其他异步框架一起使用。asyncio支持与其他库一起使用,例如aiohttp、aiomysql等。这些库都实现了asyncio的协议,并且能够与asyncio无缝地协作。

总结

asyncio是Python中用来实现异步编程的重要模块。它基于协程实现,能够实现异步I/O操作、异步任务的并发执行、超时管理和扩展性等功能。使用asyncio可以避免多线程和多进程带来的复杂性和问题。掌握asyncio对于Python开发人员来说是非常重要的。

 

asyncio异步IO标准库

(121条消息) asyncio异步IO标准库_asyncio 便准看_scwMason的博客-CSDN博客

 

 

posted @ 2023-06-05 10:05  gbc  阅读(808)  评论(0)    收藏  举报