Python:yield协程

本文介绍了Python中的协程,强调了其轻量级和用户态特性,以及在处理数据流水线和并发场景中的优势。接着,文章探讨了Gevent库,一个用于实现并发同步或异步编程的第三方库,它利用Greenlet进行协作式调度。通过猴子补丁(Monkey patching)技术,Gevent能够将标准库的阻塞调用变为协作式,从而在单线程下实现多socket并发。文中还展示了如何使用gevent进行并发操作的例子,揭示了同步与异步性能的差异,并讨论了猴子补丁的优缺点及其在实践中的应用。
摘要由CSDN通过智能技术生成

协程

协程,又称微线程,协程是一种用户态的轻量级线程(操作系统根本就不知道他的存在,是用户自己控制的)
协程是一种函数,特点是其处理过程可以在特定点挂起和恢复,因此典型情况下,协程将执行到某个特定的语句,之后执行过程被挂起等待某些数据,在这个挂起点上,程序是的其他部分可以继续执行,一旦数据到来,协程就从其他挂起点恢复执行,执行一些处理,并可能将其处理结果发送给另一个协程,协程可以有多个入口点和退出点,因为挂起和恢复执行的位置都不止一处。
在需要将多个函数应用与同样的数据时,或者是需要创建数据处理流水线时,或者是某个主数带有几个函数时,协程都是有用的,协程也可以作为线程的替代,并且更加简单,负载也更低。
在Python中,协程是一个从yield表达式中提取输入的函数,也可以将处理结果发送给接收者函数(该函数本身必须是一个协程)。

协程的好处与缺点

优点

无需线程上下文切换的开销
无需原子操作锁定以及同步的开销
方便切换控制流,简化编程模型
高并发+高扩展性+低成本。一个CPU支持上万的协程都不是问题

缺点

无法利用多核资源:协程本质是单线程,他不能同时将单个CPU的多个核用上,协程需要和进程配合才能运行在多CPU上。
进行阻塞操作会阻塞掉整个程序。因此我们需要解决这个问题,才能进行大范围的运用。比如说如果在程序运行中遇到I/O操作就会被阻塞从而造成程序的阻塞。因此我们需要在他阻塞的时候切换到另一个函数。

例子

yield协作的例子

import time

def producer():
    "用于把生产的产品发生给客户"
    #做准备
    c1.next()
    c2.next()
    c3.next()
    n=0
    #给他们5个产品
    while n<5:
        n+=1
        time.sleep(2) #制作时间
        c1.send(n)
        c2.send(n)
        c3.send(n)
        print "\033[31;0mprodecer making baozi\033[1m"

    pass

def consumer(name):
    "客户接受生产者的产品"
    while True:
        print 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值