协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

协程多与线程进行比较

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。

2) 线程进程都是同步机制,而协程则是异步

3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

协程的好处:

  • 跨平台
  • 跨体系架构
  • 无需线程上下文切换的开销
  • 无需原子操作锁定及同步的开销
  • 适用与io操作密集型,可以高效的利用多核cpu

简单实例:

import time
def A():
    while True:
        print("----A---")
        yield
        time.sleep(0.5)
def B(c):
    while True:
        print("----B---")
        c.next()
        time.sleep(0.5)
if __name__=='__main__':
    a = A()
    B(a)           

 为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

from greenlet import greenlet
import time
def test1():
    while True:
        print "---A--"
        gr2.switch()
        time.sleep(0.5)
def test2():
    while True:
        print "---B--"
        gr1.switch()
        time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
#切换到gr1中运行
gr1.switch()            

 

posted on 2020-05-01 21:29  topass123  阅读(144)  评论(0编辑  收藏  举报