多线程会消耗系统资源,多进程则有GIL限制和影响,Python中还有一种高效地执行并发任务的方式,那就是协程了。
协程也成为微线程,比线程更轻量级。协程通过在单线程内进行函数执行切换来进行并发。也就是说,协程是单线程执行,并且在线程内函数之间的执行也是可以切换的。
如果说多进程、多线程是抢占式的任务处理方式,那么协程就是协作式的任务处理方式。协程虽然是单线程,但是通过协作切换来充分利用CPU,所以也可以实现高并发的场景。多进程时程序启动多个和自己一样的子进程,每个进程都有自己的GIL,所以多进程在多核CPU上不会受GIL的影响。多线程时程序会通过进程内的主线程来启动子进程。因为在同一个进程内,所有的线程都共同一个GIL,所以多线程在多核CPU上变为串行执行。协程是通过分割主进程的计算方法来实现的,在单线程的情况下,协程始终都能获得GIL,所以不会受GIL的影响。如果希望协程利用多核CPU的计算能力,那么只能通过多进程和协程配合的模式。
协程利用Python的实现,使用关键字yield来保持函数现场的能力,并在下次调用时再恢复函数的现场。即给yield添加接收信息的能力,那么就可以实现协程了:
伪代码如下:
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print("Consumer %s ..." % n)
r = '200 OK'
def produce(c):
c.next()
n = 0
while