Python高级编程之协同程序

本文深入探讨Python中的协同程序,包括其与线程的区别、生成器的使用以及如何实现生产者-消费者模型。同时介绍了生成器表达式和itertools模块,如islice、tee和groupby等实用工具。通过实例展示了如何利用这些工具进行高效编程。
摘要由CSDN通过智能技术生成

1. 协同程序

        协同程序可以挂起、恢复,并且有多个接入点的函数。有些语言本省就提供了这种特性,如Io语言Lua语言,它们可以实现协同的多任务和管道机制。例如,每个协同程序将消费或生成数据,然后暂停,直到其他数据被传递。在Python中,协同程序的替代者是线程,它可以实现代码块之间的交互。但是因为它们表现出一种抢先式的风格,所以必须注意资源锁,而协同程序不需要。这样的代码可能变得相当复杂,难以创建和调试。但是生成器几乎就是协同程序,添加send、throw和close,其初始的意图就是为该语言提供一种类似协同程序的特性。

        PEP342实例化了生成器的新行为,也提供了创建协同程序的调度程序的完整实例。这个模块称为Trampoline,可以看做生成和消费数据的协同程序之间的媒介。它使用一个队列将协同程序连接在一起。在PyPI中的multitask模块实现了这一模式,使用也十分简单,如下:

import multitask
import time

def coroutine_1():
    for i in range(3):
        print 'c1'
        yield i

def coroutine_2():
    for i in range(3):
        print 'c2'
        yield i

multitask.add(coroutine_1())
multitask.add(coroutine_2())
multitask.run()
结果为:

c1
c2
c1
c2
c1
c2

经典的生产者-消费者问题就可以使用协同程序来实现,比多线程更为高效:

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print 'consumer %s' % n
        r = 'OK'
 
def producer(c):
    c.next()
    n = 0
    while n < 5:
        n += 1
        print 'producer %s' % n
        r = c.send(n)
        print 'consumer return %s' % r
    c.close()
 
if __name__ == '__main__':
    c = consumer()
    producer(c)
结果为:
producer 1
consumer 1
consu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值