生产者消费者 协同程序 python

因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。正如Knuth所说:“子例程是协程的特例。”因为子例程只返回一次,要返回多个值就要通过集合的形式。这在有些语言,如Forth里很方便;而其他语言,如C,只允许单一的返回值,所以就需要引用一个集合。相反地,因为协程可以返回多次,返回多个值只需要在后继的协程调用中返回附加的值即可。在后继调用中返回附加值的协程常被称为产生器。有些情况下,使用协程的实现策略显得很自然,但是此环境下却不能使用协程。典型的解决方法是创建一个子例程,它用布尔标志的集合以及其他状态变量在调用之间维护内部状态。代码中基于这些状态变量的值的条件语句产生出不同的执行路径及后继的函数调用。另一种典型的解决方案是用一个庞大而复杂的switch语句实现一个显式状态机。这种实现理解和维护起来都很困难。

生成器和普通函数有些区别,比如生成器不用return返回,而用yield来返回一系列元素

除非“召唤”生成器的next(),否则函数体里面不会执行任何代码块,上下文环境保存着。

虽然不需要明确定义__iter__()和next()方法,但是它本身包含这个方法。

当想要结束一个协程时,使用close()方法即可,close会在协程中引发GeneratorExit异常,这时候可以通过try/except捕获。

def consumer():
    try:
        while True:
            food = yield
            if not food:
                return
            print ‘Consume Food: ‘, food

    except GeneratorExit:
        print ‘====== over ======‘
    finally:
        return 

def producer():

    c1 = consumer()
    c1.send( None )
    food = {}
    for count in xrange( 5 ):
        item = chr( count + 65 )
        food[item] = count
        print ‘Produce food: ‘, food
        c1.send( food )
    c1.close()
    return

producer()

生产者消费者 协同程序 python

时间: 2024-11-03 03:39:34

生产者消费者 协同程序 python的相关文章

四、Lua协同程序

一.协同程序基础 1.什么是协同程序 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针(即可以保存变量的值和状态),同时又与其他协同程序共享全局变量和其他大部分东西. 与线程的区别是具有多个线程的程序可以同时运行几个线程,而程序任意时刻只能运行一个协同程序,并且协同程序只有被显示地(执行挂起函数)要求挂起才会暂停. 2.四种状态 (1)挂起(suspended):创建时或执行了操作coroutine.yield() (2)运行(running):执行了corouti

《Lua程序设计》9.2 管道(pipe)与过滤器(filter) 包含使用协同函数实现“生产者——消费者”问题的实例代码

一个关于协同程序的经典示例是“生产者-消费者”问题.这其中涉及到两个函数,一个函数不断地产生值(比如从一个文件中读取值),另一个则不断地消费这些值(比如将这些值写到另一个文件).通常,这两个函数大致是这样的: function producer () while true do local x = io.read() -- 产生新的值 send(x) -- 发送给消费者 end end function consumer () while true do local x = receive()

进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: 1 import paramiko 2 # 创建SSH对象 3 ssh = paramiko.SSHClient() 4 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 连接服务器 8 ss

python中的协程(协同程序)

协程:将函数编写为一个能处理输入参数的任务 使用yield语句并以表达式yield的形式创建协程 #匹配器案例: def print_info(data):    print('Looking for',data);    while True:      line = (yield)      if data in line:        print(line); 上面这个函数 就是一个协程程序 要使用这个函数 首先需用调用它 并且 向前执行到第一条yield语句 info = print_

python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终端 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

python 多线程笔记(5)-- 生产者/消费者模式

我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复杂的同步问题,就必须考虑别的办法了. threading提供的Condition对象提供了对复杂线程同步问题的支持. Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法. 使用Condition的主要方式为: 线程首先a

python中生产者消费者

1.用函数来实现生产者消费者模型 (1).源代码如下: #!/usr/bin/python #_*_coding:utf-8_*_ import threading import time import Queue import random def Producer(name, que):     while True:         if que.qsize() < 3:             que.put('baozi')             print '%s : Made a

Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 参考链接http://www.cnblogs.com/alex3714/articles/5230609.html