一、协程:
1、生成器只有在调用时才会生成相应的数据
2、调用方式有 " str__next__.()   str.send() ",
3、并且每调用一次就产生一个值调用到最后一个值后会报错
4、报错可用try和except做异常处理
 
注意:
next:是直接调用yield,并不会传值。
send:是调用并直接传值给yield。
 #!/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的雏形)的更多相关文章

  1. python学习,day4:生成器,通过yield实现单线程情况下的并发运算

    首先了解一个斐波那契函数的实现,了解下生成器的工作流程 # coding=utf-8 # Author: RyAn Bi def fib(max): n,a,b=0,0,1 while n < ...

  2. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  3. Java之HashMap在多线程情况下导致死循环的问题

    PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象   当初学Java的时候只是知道HashMap<K,V& ...

  4. 生成器 yield

    由于生成器的其中一种创建方式与列表推导式很相似,这里先说一下列表推导式. 列表推导式 列表推导式又叫列表生成式,官方叫做 list comprehension.顾名思义,这个是用来生成列表的. 用法: ...

  5. php生成器yield

    上次说了php的生成器Iterator,这次说一下yield 迭代生成器 (迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回, 而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便 ...

  6. python 生成器 yield语句

    生成器就是一个返回迭代器(iterator)的函数. 包含了 yield 的函数,就是一个生成器. 生成器每使用yield语句产生一个值,函数就会被冻结(暂停执行),被唤醒后(即再次调用)接着上次执行 ...

  7. Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递

    python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...

  8. java 哪些情况下会使对象锁释放

    Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...

  9. PHP性能优化利器:生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

随机推荐

  1. POJ 1661 Help Jimmy(递推DP)

    思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...

  2. hadoop程序MapReduce之average

    需求:求多门课程的平均值. 样板:math.txt zhangsan 90 lisi 88 wanghua 80 china.txt zhangsan 80lisi 90wanghua 88 输出:z ...

  3. 编写一个读写倾斜测量数据.s3c文件格式的OSG插件osgdb_s3c

    VS新建一个空的DLL工程 ReaderWriterS3C.cpp源文件 #include <osg/Notify> #include <osgDB/FileNameUtils> ...

  4. N76E003学习之路(二)

    最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...

  5. echarts实现柱状图分页展示

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 【Mysql】解决插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误

    背景: 用户输入的表单里边.存在 手机自带的表情,  在执行插入时候报错 Incorrect string value: '\xF0\x9F\x92\x8BTi...' 错误原因:我们在设置mysql ...

  7. 【ecshop】调用购物车商品数量

    1 打开 includes/lib_insert.php 在最后位置添加如下代码: /** * 调用购物车商品数目 */ function insert_cart_mes_num() { $sql = ...

  8. c++ 重载、重写、重定义(隐藏)

    1.重载overload:函数名相同,参数列表不同. 重载只是在类的内部存在,或者同为全局范围.(同名,同参函数返回值不同时,会编译出错.因为系统无法知晓你到底要调用哪一个.)   2.重写overr ...

  9. LeetCode——Number of 1 Bits

    //求一个整数的二进制串中1的个数 public int hammingWeight(int n) { String b_str = Integer.toBinaryString(n); int b_ ...

  10. setTimeout原来有这种用途

    setTimeout有两个参数,第一个是需要执行的函数,第二个是将该函数推入UI队列的时间. 需要注意的两点: 1.第二个参数中设置的时间,是从执行setTimeout开始计算,而不是从整个函数执行完 ...