Python的协程包含:
1. 协程创建:
- 使用asyncio.coroutine装饰器将函数打上coroutine标记
- 被装饰的函数会变为一个协程对象,可以将其挂起和恢复执行
- 语法:
python import asyncio @asyncio.coroutine def func(): print('Hello') yield from asyncio.sleep(1) print('World') |
2. 协程调度:
- 协程需要在事件循环中执行,才能切换任务
- 使用asyncio.get_event_loop()获取事件循环
- 使用yield from可以恢复任务,切换到其他任务
- 语法:
python loop = asyncio.get_event_loop() loop.run_until_complete(func()) |
3. 创建任务:
- 可以将协程对象封装为Task(任务)对象,增加调度实体
- 语法:
python from asyncio import Task task = Task(func()) loop.run_until_complete(task) |
4. Future对象:
- 协程的调用会返回一个Future对象,代表未来的执行结果
- 可以为Future对象添加回调,当协程执行完毕后回调会被调用
- 语法:
python fut = func() fut.add_done_callback(callback) |
5. 等待其他协程:
- 可以使用yield from asyncio.sleep(time)挂起当前协程一段时间
- 可以使用yield from fut等待另一个Future对象的完成
- 语法:
python fut1 = func1() yield from fut1 fut2 = func2() yield from asyncio.gather(fut1, fut2) # 等待多个Future |
示例:
python import asyncio @asyncio.coroutine def func1(): print('func1 start') yield from asyncio.sleep(2) print('func1 end') @asyncio.coroutine def func2(): print('func2 start') yield from asyncio.sleep(1) print('func2 end') loop = asyncio.get_event_loop() tasks = [func1(), func2()] loop.run_until_complete(asyncio.wait(tasks)) loop.close() |
协程是轻量级线程,可以实现并发编程。要理解协程与线程的区别,选择正确的并发方式解决问题。
要会使用asyncio模块创建协程、调度执行和等待其他协程。要会给Future对象添加回调,在协程完成后执行。
协程的理解和运用可以实现并发编程,提高程序效率。要在项目中根据需求选择线程或协程解决问题。
协程属于比较高级的技术,要深入学习相关知识。asyncio模块的熟练运用是Python高手必备技能,需要长期实践。
要在代码中养成使用协程的习惯,编写异步、高效的程序。协程编程还需要注意各种问题,实现正确的异步逻辑。