1.协程可以让程序停留在上一次被调用的位置.当程序停止时,去执行其他的程序。
优点:
(1)进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显
(2)不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程 ,对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。
python中yield协程的实现:
def main():
for i in range(10):
#yield作用使程序在这里停止,并且当调用next方法时,把当前i的值返回。
yield i
#这里函数返回值,会在上面循环依次完成时被输出
return "hello"
a = main()
while True:
try:
#通过next方法
print(next(a))
except Exception as e:
#这个e异常存的是函数返回值
print(e)
break
python 中gevent 协程实现:
from gevent import monkey
import time
#这里让程序遇到暂停就贴换,去做其他事情
monkey.patch_all()
def demo1():
while True:
print("..1..")
#让程序睡1秒再开始执行
time.sleep(1)
def demo2():
while True:
print("..2..")
# 让程序睡1秒再开始执行
time.sleep(1)
def main():
#准备协程、g1,g2
g1=gevent.spawn(demo1)
g2 = gevent.spawn(demo2)
#开启协程1,2,协程只有被开始才会生效。
g1.join()
g2.join()
#这里协程比较多时写成一般写成
# gevent.joinall([gevent.spawn(demo1),gevent.spawn(demo2)])
if __name__ == '__main__':
main()