协程(Coroutine)是一种程序组件,它可以在执行过程中暂停和恢复,允许其他协程在此期间运行。在Python中,协程可以通过多种方式实现,以下是使用协程的一些常见方法:
使用`asyncio`库
`asyncio`是Python 3.4及以上版本中用于编写异步代码的库,它使用`async`和`await`关键字来定义协程。
import asyncio
async def async_func():
print('开始执行')
await asyncio.sleep(1) 异步等待1秒
print('执行结束')
获取事件循环
loop = asyncio.get_event_loop()
运行协程
loop.run_until_complete(async_func())
关闭事件循环
loop.close()
使用`greenlet`库
`greenlet`是一个轻量级的并发库,它允许在Python中创建协程。
from greenlet import greenlet
def func1():
print('func1 start')
gr2.switch()
print('func1 end')
def func2():
print('func2 start')
gr1.switch()
print('func2 end')
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch() 开始执行func1
使用`gevent`库
`gevent`是一个基于协程的网络库,它使用协程来实现高并发。
import gevent
from gevent import monkey
monkey.patch_all() 打补丁,使得标准库中的阻塞调用变为非阻塞
def foo():
print('hello bar')
gevent.sleep(2)
print('hello bar too')
def bar():
print('hello foo')
gevent.sleep(1)
print('hello foo too')
gevent.joinall([gevent.spawn(foo), gevent.spawn(bar)]) 并发执行
使用`yield`关键字(生成器协程)
在Python 2.x中,可以使用生成器和`yield`关键字来创建协程。
def simple_coroutine():
print('start')
x = yield
print('received', x)
sc = simple_coroutine()
sc.send('hello') 发送数据给协程
注意事项
协程可以让出CPU时间片,让其他任务得以运行,特别适用于I/O密集型任务。
协程的切换由协程自身控制,当协程遇到I/O操作或其他需要等待的情况时,可以主动让出CPU。
使用`asyncio`库时,事件循环(`event_loop`)负责管理协程的执行。
使用`greenlet`或`gevent`库时,需要显式地创建和管理协程对象。
希望这些信息能帮助你理解Python中协程的使用方法。