python简单协程使用示例

使用示例

创建协程: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

你可能感兴趣的:(python简单协程使用示例)