用yield写协程实现生产者消费者

思路:

  yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式

代码:

  import random  #随机数,模拟生产者的制造物

  def eat():    #消费者

    while True:

      item = (yield)

      print("消费了:",item)

    

  def pro(g):    #生产者

    next(g)

    while True:

      item = random.randint(0,99)

      print("生产了:",item)

      g.send(item)

  #调用

  g = eat()    #创建生成器实例

  pro(g)   

  图例:

    

   

    

原文地址:https://www.cnblogs.com/cxhzy/p/10014925.html

时间: 2024-11-08 19:37:29

用yield写协程实现生产者消费者的相关文章

【Python】协程实现生产者消费者模型

协程的实现为协作式而非抢占式的,这是和进程线程的最大区别.在Python中,利用yield和send可以很容易实现协程. 首先复习下生成器. 如果一个函数使用了yield语句,那么它就是一个生成器函数.当调用这个函数时,它返回一个迭代器.当第一次调用__next__()时候,生成器函数主体开始执行,遇到yield表达式时候终止. 当使用__next__()方法时候,yield value语句返回None:当使用send(v)方法时候,yield value返回v.也就是说,__next__()方

使用管程实现生产者消费者模式

生产者消费者模式是一种常见的设计模式,掌握一种完美,稳定的实现方式非常有用,下面我就使用misa管程实现生产者消费者模式. 这种实现的优点: 1.稳定,不会出现死锁现象 2.运行速度相对较快 话不多说,直接上代码: 管程类: package com.brave.test; import java.util.ArrayList; import java.util.List; /** * * @描述:管程区 * * @author <p>[email protected]<p> bra

用yield实现协程 和asyncio模块

用yield实现协程 #基于yield实现异步 import time def consumer(): '''任务1:接收数据,处理数据''' while True: x=yield def producer(): '''任务2:生产数据''' g=consumer() next(g) for i in range(10000000): g.send(i) producer() 使用yield from实现的协程 import datetime import heapq # 堆模块 import

Java 管程解决生产者消费者问题

同样是实验存档.//.. 依然以生产者消费者问题作为背景. 管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就 ok,不用去考虑进程同步的问题. 管程: package entity.producerconsumer; public class Monition { private Buffer buffer; public Monition(int bufferSize) { buffer = new Buffer(bufferSize); } /** * 如

手贱瞎写不要看:生产者消费者-同步问题

1 package ThreadL; 2 3 import java.util.LinkedList; 4 5 class Queue extends LinkedList<String>{ 6 int lenght; 7 public Queue(){ 8 9 } 10 11 public Queue(int length){ 12 this.lenght = length; 13 } 14 15 public int getLength(){ 16 return this.lenght;

FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要发个Get请求获取百度首页内容: php同步方式:$result = file_get_contents("http://www.baidu.com"), php果然是世界上最好的语言,多么简洁. 然后java和c++的同学开始不屑了: "呵呵, 同步,鄙视你不解释."

11.python并发入门(part12 初识协程)

一.协程的简介. 协程,又被称为微线程,虽然是单进程,单线程,但是在某种情况下,在python中的协程执行效率会优于多线程. 这是因为协程之间的切换和线程的切换是完全不一样的!协程的切换是由程序自身控制的(程序的开发者使用yield去进行控制,协程和协程之间的切换是可控制的,想什么时候切换就什么时候切换). 当使用多线程时,开的线程越多,协程的优势就越明显. 协程的另一个优点,就是无需锁机制,因为协程只有一个进程,和线程,不存在多线程或者多进程之间访问公共资源的冲突,所以说,在协程中无需加锁,如

Python学习经验之谈:关于协程的理解和其相关面试问题

都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都是根据我自己的Python学习经验来写的,有这方面需求的伙伴可以认真阅读,也欢迎补充不足之处! 一.什么是协程 协程:实现协作式多任务,可以在程序执行内部中断,转而执行其他协程. 比如我们编写子程序(或者说函数),通常是利用“调用”来实现从 A 跳去 B,B 跳去 C,如果想回来调用方,必须等被调用

协程初探

文章出处:http://blog.csdn.net/lanphaday/archive/2010/03/19/5397038.aspx 协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比方 Lua.ruby 和最新的 Google Go,当然也还有近期非常让我惊艳的 falcon.协程是用户空间线程,操作系统对其存在一无所知,所以须要用户自己去做调度,用来运行协作式多任务非常合适.其有用协程来做的东西,用线程或进