FastAPI Web开发入门、进阶与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 asyncio协程简单应用

本节通过几个简单的案例来说明同步和异步之间的差异,通过案例,我们可以从代码层面体会同步和异步是如何提升运行效率的。

读者可以从码云上下载代码,每一章或节都有对应的案例说明,不同的章节分布在不同的目录下,以下案例位于\fastapi_tutorial\chapter01\contrast_sync_async。

案例说明:这里循环请求50次,以百度首页为对比对象。首先使用单线程同步代码的方式请求处理,具体示例代码如下。

上述代码说明:

❑首先导入了requests库以及time库。

❑然后定义了一个名为take_up_time的装饰器。它主要用于计算被装饰函数的业务逻辑执行所需的时间。

❑紧接着定义了request_sync()函数。在函数内部,通过requests向百度首页地址发起请求处理。

❑最后定义了一个run()函数。该函数使用@take_up_time进行装饰处理,且在run()函数内部,通过for循环的方式进行遍历,通过调用request_sync()函数进行请求处理。

上述代码的执行结果为:

上面的案例在使用requests同步库请求50次百度首页地址的情况下,显示消耗的时间约为2562ms。接下来更换为一个异步的HTTP请求库,改写并发请求处理,具体代码如下。

上述代码说明:

❑首先导入了aiohttp、asyncio以及time库。其中,asyncio用于异步处理,aiohttp用于异步请求处理。

❑然后定义了一个名为take_up_time的装饰器。它主要用于计算被装饰函数的业务逻辑执行所需的时间。

❑紧接着定义了一个request_async()协程函数。在该协程函数内部,主要通过aiohttp发起异步请求处理。

❑最后定义了一个run()函数。该函数使用@take_up_time进行装饰处理,且在run()函数内部,通过for循环的方式批量创建协程任务,并添加到tasks列表中,之后通过调用asyncio.gather(*tasks)批量并发调用request_async()协程函数来进行请求处理。

上述代码的执行结果为:

上面的案例在使用aiohttp异步库请求50次百度首页地址的情况下,显示消耗的时间约为329ms。由此可见,同样是并发处理50次,同样是在单线程的情况下,使用异步协程的方式处理请求比同步处理耗时更短了。这就是异步的特性。