python 协程

通过 yield 方式实现

# -*- coding: utf-8 -*-

'''
协程,又称为线程,是一种用户装态的轻量级线程。
协程拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存在其他地方,
在切回来的时候恢复到先前保存的寄存器上下文和栈


协程的好处:
    1.无需线程上下文切换的开销
    2.方便切换控制流,简化编程模型
    3.无需院子操作锁定及同步的开销
    4.高并发,高扩展,低成本
    
缺点:
    1.无法利用多核资源
    2.阻塞操作会阻塞整个程序
    
'''


import time
import queue


def consumer(name):
    print("------->start eating baozi")
    while True:
        #函数中有yield的时候这个函数会变成一个生成器,当调用__next()__方法的时候会继续运行
        new_baozi = yield
        print("[%s] is eating baozi %s"%(name,new_baozi))



def producer():
    r = con.__next__()
    r = con2.__next__()
    n=0
    while n<5:
        n+=1
        con.send(n)
        con2.send(n)
        print('%s making baozi '%n)

if __name__=='__main__':
    con = consumer('c1')
    con2 = consumer('c2')
    p = producer()

 

greenlet 实现手动切换协程

# -*- coding: utf-8 -*-
from greenlet import  greenlet

def test1():
    print(12)
    gr2.switch()
    print(34)
    gr2.switch()
    
def test2():
    print(56)
    gr1.switch()
    print(78)
    
    
#启动一个协程
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch() #协程的切换

 

gevent  实现自动切换

import gevent


def foo():
    print('runing in foo')
    gevent.sleep(2)
    print('再次切回到foo')


def bar():
    print("切换到bar")
    gevent.sleep(1)
    print('切换回bar')


gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])

 

posted on 2017-12-16 20:53  gaizhongfeng  阅读(124)  评论(0编辑  收藏  举报