协程
子程序
子程序(函数)在所有语言中都是层级调用,比如A 调用B,B调用C,C执行完毕返回,B执行完毕返回,最后A执行完。
子程序调用是通过栈实现,一个线程执行一个子程序。
协程
看上去也是子程序,执行时,在程序内部可中断(不是函数调用,有点类似于CPU中断),转去执行别的子程序,在适当的时候再返回来接着执行。
协程的特点在于是一个线程执行。
协程的优势:
1极高的执行效率,因为子程序切换不是线程切换,因此没有线程切换的开销。
2不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。
协程是一个线程执行,那怎么利用多核CPU?多进程+协程
python对协程的支持是通过generator实现的。
在generator中,可以通过调用next()函数获取有yield语句返回的下一个值。
但python的yield语句不但可以返回一个值,还可以接收调用者发出的参数。!!
Python生成器generator之next和send运行流程
生产者-消费者案例:
def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
输出:
[PRODUCER] Producing 1... [CONSUMER] Consuming 1... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 2... [CONSUMER] Consuming 2... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 3... [CONSUMER] Consuming 3... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 4... [CONSUMER] Consuming 4... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 5... [CONSUMER] Consuming 5... [PRODUCER] Consumer return: 200 OK
如有疑问请联系我,写的不对的地方请联系我进行更改,感谢~ QQ:1968380831