Trio翻译过来是三重奏的意思,它提供了更方便异步编程,是asyncio的更高级的封装。
它试图简化复杂的asyncio模块。使用起来比asyncio和Twisted要简单的同时,拥有其同样强大功能。这个项目还很年轻,还处于试验阶段但是整体设计是可靠的。作者鼓励大家去尝试使用,如果遇到问题可以在git上对他提issue。同时作者还提供了一个在线聊天室更方便与其沟通:https://gitter.im/python-trio/general。
准备工作
- 确保你的python版本在3.5以及以上。
- 安装trio。python3 -m pip install --upgrade trio
import trio 运行是否有错误,没有错误可以往下进行了。
知识准备Async方法
使用trio也就意味着你需要一直写异步方法。
# 一个标准方法
def regular_double(x):
return 2 * x
# 一个异步方法
async def async_double(x):
return 2 * x
从外观上看异步方法和标准方法没什么区别只是前面多了个async。
“Async” 是“asynchronous”的简写,为了区别于异步函数,我们称标准函数为同步函数,
从用户角度异步函数和同步函数有以下区别:
- 要调用异步函数,必须使用await关键字。 因此,不要写regular_double(3),而是写await async_double(3).
- 不能在同步函数里使用await,否则会出错。
句法错误:
def print_double(x):
print(await async_double(x)) # <-- SyntaxError here
但是在异步函数中,await是允许的:
async def print_double(x):
print(await async_double(x)) # <-- OK!
综上所述:作为一个用户,异步函数相对于常规函数的全部优势在于异步函数具有超能力:它们可以调用其他异步函数。
在异步函数中可以调用其他异步函数,但是凡事有始有终,第一个异步函数如何调用呢?
我们继续往下看
为何调用第一个异步函数
import trio
async def async_double(x):
return 2 * x
trio.run(async_double, 3) # returns 6
这里我们可以使用trio.run来调用第一个异步函数。
接下来让我们看看trio的其他功能
异步中的等待
import trio
async def double_sleep(x):
await trio.sleep(2 * x)
trio.run(double_sleep, 3) # does nothing for 6 seconds then returns
这里使用了异步等待函数 trio.sleep,它的功能和同步函数中的time.sleep()差不多,但是因为需要使用await调用,所以由前面的结论我们知道这是一个异步函数用的等待方法。
事实这个例子没有实际用处,我们用同步函数就可以实现这个简单的功能。这里主要是为了演示异步函数中通过await可以调用其他的异步函数。
异步函数调用的典型结构
trio.run -> [async function] -> ... -> [async function] -> trio.whatever
不要忘了写await
如果忘了写await会发生什么,我们看下面的这个例子
import time
import trio
async def broken_double_sleep(x):
print("*yawn* Going to slee