通过生成器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才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...
随机推荐
- [java] java 中Unsafe类学习
java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法all ...
- [java] java 线程join方法详解
join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...
- WPF 在事件中绑定命令
导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...
- Javascript 字符串替换
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- ASP代码审计学习笔记 -2.XSS跨站脚本
XSS漏洞: 漏洞代码: <% xss=request("xss") response.write(xss) %> 漏洞利用: 漏洞修复: Server.HTMLEnc ...
- locals()
locals() 有两种情况: (1) 如果在函数内部使用 locals(),那么会以字典的形式返回函数内部定义的变量,如下例1(2) 如果在函数外部使用 locals(),那么会以字典的形式返回全局 ...
- m2014-architecture-imgserver->配置lighttpd mod_mem_cache 模块做静态资源服务器
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freehat.blog.51cto.com/1239536/989171 一 l ...
- JavaScript基础细讲
JavaScript基础细讲 JavaScript语言的前身叫作Livescript.自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原 ...
- java基础---->Reference的使用(一)
这里记录一些java中关于引用的知识. java中的引用 一.java中关于引用的测试 public class ReferenceTest { public static void main(Str ...
- Java三方---->Thumbnailator框架的使用
Thumbnailator是一个用来生成图像缩略图的 Java类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图.有了它我们就不用在费心思使用Image I/O API,J ...