通过生成器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才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...
随机推荐
- Android问题集锦之三十四:android studio导入项目下载gradle-x.x.x-all.zip
每每打开github上的项目,都会先下载gradle.每一个项目都有自己的gradle构建程序,可是打开一个新项目就又一次下载gradle对于网络较差的情况真是苦不堪言.所以我们能够用已经下载好的放到 ...
- Android ListView圆角
首先来看看ListView 相关基本属性 1.单击列表后,列表的背景变成黑色了. 可通过指定android:cacheColorHint的属性来放变它,将它指定为透明. 使用以下的属性值: a ...
- Python 爬虫知识点 - XPath
http://cuiqingcai.com/2621.html 一.基础介绍 <bookstore> <book> <title>Harry Potter</ ...
- linux上如何快速删除一个目录
在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决.直接rm就可以了,不过要加两个参数-rf 即:rm -rf ...
- CMS3.0——初次邂逅express
前言: 刚接手cms3.0的工作,似乎对一切都那么的不熟悉,于是在开始新需求之前,先做一个简单的登录系统. 项目目录: 1.使用webstroms建expreess项目,非常方便简单,建好的项目目录就 ...
- java基础---->多个排序的拓展
根据一些特定的规则,我们可以利用java的反射机制做到很有趣的封装. java的排序封装 一.定义一些comparator AmountComparatorAsc:amount升序 package c ...
- JS-提取字符串—>>普通方法VS正则表达式
如下:“23nr qreq2 34fq4 4454gsr 45” [将这一串字符中的数字挑出来,当然人家作伴的不能被分开]. 一.普通方法: <script type="text/ja ...
- LeetCode——Binary Search Tree Iterator
Description: Implement an iterator over a binary search tree (BST). Your iterator will be initialize ...
- ubuntu 14.04 返回到经典桌面方法
1.打开终端,运行下面命令:sudo apt-get install gnome-session-fallback 2.重启机器,选择gnome,然后登录
- javascript构造函数及原型对象
/** @ javascript中没有类的概念,所以基在对象创建方面与面向对象语言有所不同* @ 对象创建的常用方法及各自的局限性* @ 使用Object或对象字面量创建对象* @ 工厂模式创建对象* ...