通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)
#!/usr/bin/env python
# -*- coding:utf8 -*-
# Author:Dong Ye '''
定义两个模型:
一个是生产包子的。(生成器)
另一个是吃包子的。(迭代器) 这段功能实现了异步IO的雏形,也是一个简单的协程处理方式。
协程的特点:实际是串行方式分开执行的,但由于运行效果快,给人的感觉像是并行。
因此,协程也叫作:单线程下的并行执行效果。
协程是包含在线程里的一个单位,线程时进程的一个单位。
例如:enginx在异步单线程下,比多线程要快好多倍,也就是这种效果。
''' import time #吃包子的
def consumer(name):
print('%s 准备吃包子了!' % name)
while True:
baozi = yield
print("包子[%s]来了。被[%s]吃了!" %(baozi,name)) #生产包子的
def producer(name):
#先定义2个协程(消费者)#将函数变成生成器
c1 = consumer('A') #2个消费者
c2 = consumer('B') #相当于2个协程(进程,线程,协程)
#开始调用生成器初始化(准备吃包子)
c1.__next__() #开始调用生成器,只有next的时候才会到yield进行下一个操作
c2.__next__()
print('老子开始吃包子拉!')
#循环的次数,每次循环都会传值给生成器(产生什么样的包子)
for i in range(10):
time.sleep(1)
print("做了一个包子,分2半,一人一半")
c1.send(i) #包子的类型
c2.send(i) producer("alex") '''
#手动做包子:
c = consumer("dy")
c.__next__()
#c.__next__() b1 = "韭菜馅"
c.send(b1) #调用+传值
#c.__next__() #只调用,不传值
''' 显示结果:
A 准备吃包子了!
B 准备吃包子了!
老子开始吃包子拉!
做了一个包子,分2半,一人一半 #任务1
包子[0]来了。被[A]吃了! #任务2
包子[0]来了。被[B]吃了! #任务3
做了一个包子,分2半,一人一半
包子[1]来了。被[A]吃了!
包子[1]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[2]来了。被[A]吃了!
包子[2]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[3]来了。被[A]吃了!
包子[3]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[4]来了。被[A]吃了!
包子[4]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[5]来了。被[A]吃了!
包子[5]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[6]来了。被[A]吃了!
包子[6]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[7]来了。被[A]吃了!
包子[7]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[8]来了。被[A]吃了!
包子[8]来了。被[B]吃了!
做了一个包子,分2半,一人一半
包子[9]来了。被[A]吃了!
包子[9]来了。被[B]吃了!
协程的示例
通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)的更多相关文章
- python学习,day4:生成器,通过yield实现单线程情况下的并发运算
首先了解一个斐波那契函数的实现,了解下生成器的工作流程 # coding=utf-8 # Author: RyAn Bi def fib(max): n,a,b=0,0,1 while n < ...
- 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...
- Java之HashMap在多线程情况下导致死循环的问题
PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象 当初学Java的时候只是知道HashMap<K,V& ...
- 生成器 yield
由于生成器的其中一种创建方式与列表推导式很相似,这里先说一下列表推导式. 列表推导式 列表推导式又叫列表生成式,官方叫做 list comprehension.顾名思义,这个是用来生成列表的. 用法: ...
- php生成器yield
上次说了php的生成器Iterator,这次说一下yield 迭代生成器 (迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回, 而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便 ...
- python 生成器 yield语句
生成器就是一个返回迭代器(iterator)的函数. 包含了 yield 的函数,就是一个生成器. 生成器每使用yield语句产生一个值,函数就会被冻结(暂停执行),被唤醒后(即再次调用)接着上次执行 ...
- Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递
python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...
- PHP性能优化利器:生成器 yield理解
如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...
随机推荐
- js正则表达式的应用
JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现. //检查email邮箱 function isEmail(str){ var reg = /^([a- ...
- linux环境中,查询网卡的速度(带宽)
需求描述: 今天一同事要整理测试环境的主机硬件配置信息,需要提供网卡的速度的信息, 所以,就查询了下,在此记录下. 操作过程: 1.首先通过ip a命令查询主机的网口名称 [root@redhat6 ...
- 把握linux内核设计思想(七):内核定时器和定时运行
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 前面章节说到了把工作推后到除如今以外的时间运行的机制是下半部机 ...
- 【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监測EV3port数据
在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个主要的设想.而且介绍了要完毕项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正開始项目实践. ==第一个项目: EV3 ...
- 超全面的JavaWeb笔记day08<Tomcat&Web应用&HTTP协议>
1.常用软件体系结构 BS:浏览器/服务器 CS:客户端/服务器 WEB资源 动态资源 JSP Servlet 静态资源 html 常用服务器 Tomcat Weblogic Resin JBOSS ...
- linux 安装 nodejs
原文地址:https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora 1)定位到nodejs的官方源(如果直 ...
- java日志之log4j简单使用
1.导入包log4j.jar 2.src同级创建并设置log4j.properties ### 设置### log4j.rootLogger = debug,stdout,D,E ### 输出信息到控 ...
- Zookeeper(一)-- 简介以及单机部署和集群部署
一.分布式系统 由多个计算机组成解决同一个问题的系统,提高业务的并发,解决高并发问题. 二.分布式环境下常见问题 1.节点失效 2.配置信息的创建及更新 3.分布式锁 三.Zookeeper 1.定义 ...
- On iPad, UIImagePickerController must be presented via UIPopoverController
本文转载至:http://blog.csdn.net/k12104/article/details/8537695 On iPad, UIImagePickerController must be p ...
- 【Mysql】解决插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
背景: 用户输入的表单里边.存在 手机自带的表情, 在执行插入时候报错 Incorrect string value: '\xF0\x9F\x92\x8BTi...' 错误原因:我们在设置mysql ...