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下不保证正常安装和运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值