使用示例
创建协程:coroutine = func()
。
创建事件循环:loop = asyncio.get_event_loop()
。
创建task:task = loop.create_task(coroutine)
。将协程变成task。新建task的状态为pending。(可以将loop.create_task()和loop.ensure_future()视为同等作用。
启动task:loop.run_until_complete(task)
。把task加入循环,当完成后task状态从pending变为finished。
task执行完后绑定回调:add_done_callback
。
挂起协程:await
。
示例代码
import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
print("Waiting:",x)
await asyncio.sleep(x)
return "Done after {}s".format(x)
start = now()
# 创建协程
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(4)
# 创建事件循环
loop = asyncio.get_event_loop()
# 创建任务
tasks = [
asyncio.ensure_future(coroutine1),
asyncio.ensure_future(coroutine2),
asyncio.ensure_future(coroutine3)
]
# 启动task
loop.run_until_complete(asyncio.wait(tasks))
# 所有task执行完后,才会结束事件循环,才能执行下面的程序
for task in tasks:
print("Task ret:", task.result())
print("Time:", now()-start)
执行结果
Waiting: 1 # 执行协程do_some_work(1) 执行print,再等待1秒
Waiting: 2 # 在协程1等待时候,执行协程do_some_work(2) 执行print,再等待2秒
Waiting: 4 # 执行协程do_some_work(4) 先print,等待4秒
Task ret: Done after 1s #所有协程结束后(等待事件为运行时间最长的协程4s),loop结束,依次打印task的返回值
Task ret: Done after 2s
Task ret: Done after 4s
Time: 4.004154920578003
网友评论