Python自学笔记十、协程

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中自己规定代码块的执行顺序,和多线程相比,线程数量越多则协程的优势越明显;另外它不存在多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协成中控制共享资源不加锁,只需要判断状态。

Python对协程的支持是通过generator实现的。

def Cola():
    r=''
    while True:
        i=yield r
        if not i:
            break
        print 'i finish my cola %s'% n
        r='thank you'

def Bread(c):
    c.send(None)
    i=0
    while i<5:
        i=i+1
        print 'i finsh my bread %s'% n
        r=c.send(i)
        print 'i finish my dinner %s'%r
    c.close()
c=Cola()
Bread(c)

Python通过yield提供了对协程的基本支持,但是不完全。
协程有两个模块分别为greenlet和gevent 其中greenlet为原始的模块而gevent为高级的,在greenlet的基础上进行了封装使用更为方便,可以通过pip3安装gevent也可以源码安装,需要注意安装gevent 的时候需要先安装greenlet。
1.使用greenlet实例:

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()


#######output#######
12
56
34
78

2.gevent实例

import gevent

def foo():
    print('12')
    gevent.sleep(0)
    print('34')

def bar():
    print('56')
    gevent.sleep(0)
    print('78')

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

使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行。

你可能感兴趣的:(Python)