通过生成器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才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...
随机推荐
- libui-node体验笔记
简介 libui-node是基于libui库的node封装.libui库是一个简便的将本地原生的GUI封装的C语言库,并支持各平台(Mac,Linux,windows).官网提供了第三方封装文档,开发 ...
- 合格前端系列第六弹-从指向看JavaScript
https://my.oschina.net/qiangdada/blog/1484001
- C# 温故而知新:Stream篇(二)
TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...
- 关于 MVVMLight 设计模式系列
MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...
- Leetcode: mimimum depth of tree, path sum, path sum II
思路: 简单搜索 总结: dfs 框架 1. 需要打印路径. 在 dfs 函数中假如 vector 变量, 不用 & 修饰的话就不需要 undo 2. 不需要打印路径, 可设置全局变量 ans ...
- 端口占用处理(Windows)
1. netstat -ano 看看 443端口被占用没 ,一般是本地地址加上端口号,那个端口号就是你要找的,同时最后一列是PID,即进程号. (常用的软件有虚拟机.VisualSVNServer)2 ...
- Hash表 hash table 又名散列表
直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...
- 实例:用类来写一个 memcached 启动脚本
[root@localhost ~]$ yum install -y memcached #!/usr/bin/env python #-*- coding:utf-8 -*- import os i ...
- onTouch
OnTouchOmOnTouchListenerOnTouchEvent View的事件分发 : 对于事件分发机制,举个简单的例子,在一个Activity中只有一个按钮,如果我们想给这个按钮注册 ...
- mqtt 服务器与客户端通讯
mqtt 服务器与客户端通讯. 服务器端 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...