前记
Python新的版本中支持了async/await
语法, 很多文章都在说这种语法的实现代码会变得很快, 但是这种快是有场景限制的。这篇文章将尝试简单的解释为何Async
的代码在某些场景比Sync
的代码快。
1.一个简单的例子
首先先从一个例子了解两种调用方法的差别, 为了能清晰的看出他们的运行时长差别, 都让他们重复运行10000次, 具体代码如下:
import asyncio
import time
n_call = 10000
# sync的调用时长
def demo(n: int) -> int:
return n ** n
s_time = time.time()
for i in range(n_call):
demo(i)
print(time.time() - s_time)
# async的调用时长
async def sub_demo(n: int) -> int:
return n ** n
async def async_main() -> None:
for i in range(n_call):
await sub_demo(i)
loop = asyncio.get_event_loop()
s_time = time.time()
loop.run_until_complete(async_main())
print(time.time() - s_time)
# 输出
# 5.310615682601929
# 5.614157438278198
可以看得出来, sync
的语法大家都是很熟悉, 而async
的语法比较不一样, 函数需要使用async def
开头, 同时调用async def
函数需要使用await
语法, 运行的时候需要先获取线程的事件循环, 然后在通过事件循环来运行async_main
函数来达到一样的效果, 但是从运行结果的输出可以看得出, sync
的语法在这个场景中比async
的语法速度快了一些些(由于Python的GIL原因, 这里无法使用多核的性能, 只能以单核来跑)。
造成这样的原因是同样由同一个线程执行的情况下(cpu单核心),async
的调用还需要经过一些事件循环的额外调用, 这会产生一些小开销, 从而运行时间会比sync
的慢, 同时这是一个纯cpu运算的示例, 而async
的的优势在于网络io运算, 在这个场景无法发挥优势, 但会在高并发场景则会大放光彩, 造成这样