zoukankan      html  css  js  c++  java
  • 通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)

    一、协程:
    1、生成器只有在调用时才会生成相应的数据
    2、调用方式有 " str__next__.()   str.send() ",
    3、并且每调用一次就产生一个值调用到最后一个值后会报错
    4、报错可用try和except做异常处理
     
    注意:
    next:是直接调用yield,并不会传值。
    send:是调用并直接传值给yield。
     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 # Author:Dong Ye
     4 
     5 
     6 '''
     7 定义两个模型:
     8 一个是生产包子的。(生成器)
     9 另一个是吃包子的。(迭代器)
    10 
    11 这段功能实现了异步IO的雏形,也是一个简单的协程处理方式。
    12 协程的特点:实际是串行方式分开执行的,但由于运行效果快,给人的感觉像是并行。
    13 因此,协程也叫作:单线程下的并行执行效果。
    14 协程是包含在线程里的一个单位,线程时进程的一个单位。
    15 例如:enginx在异步单线程下,比多线程要快好多倍,也就是这种效果。
    16 '''
    17 
    18 import time
    19 
    20 
    21 #吃包子的
    22 def consumer(name):
    23     print('%s 准备吃包子了!' % name)
    24     while True:
    25         baozi = yield
    26         print("包子[%s]来了。被[%s]吃了!" %(baozi,name))
    27 
    28 
    29 #生产包子的
    30 def producer(name):
    31     #先定义2个协程(消费者)#将函数变成生成器
    32     c1 = consumer('A')   #2个消费者
    33     c2 = consumer('B')   #相当于2个协程(进程,线程,协程)
    34     #开始调用生成器初始化(准备吃包子)
    35     c1.__next__()     #开始调用生成器,只有next的时候才会到yield进行下一个操作
    36     c2.__next__()
    37     print('老子开始吃包子拉!')
    38     #循环的次数,每次循环都会传值给生成器(产生什么样的包子)
    39     for i in range(10):
    40         time.sleep(1)
    41         print("做了一个包子,分2半,一人一半")
    42         c1.send(i) #包子的类型
    43         c2.send(i)
    44 
    45 
    46 producer("alex")
    47 
    48 
    49 
    50 '''
    51 #手动做包子:
    52 c = consumer("dy")
    53 c.__next__()
    54 #c.__next__()
    55 
    56 b1 = "韭菜馅"
    57 c.send(b1)     #调用+传值
    58 #c.__next__()  #只调用,不传值
    59 '''
    60 
    61 
    62 
    63 
    64 显示结果:
    65 A 准备吃包子了!
    66 B 准备吃包子了!
    67 老子开始吃包子拉!
    68 做了一个包子,分2半,一人一半  #任务1
    69 包子[0]来了。被[A]吃了!      #任务2
    70 包子[0]来了。被[B]吃了!      #任务3
    71 做了一个包子,分2半,一人一半
    72 包子[1]来了。被[A]吃了!
    73 包子[1]来了。被[B]吃了!
    74 做了一个包子,分2半,一人一半
    75 包子[2]来了。被[A]吃了!
    76 包子[2]来了。被[B]吃了!
    77 做了一个包子,分2半,一人一半
    78 包子[3]来了。被[A]吃了!
    79 包子[3]来了。被[B]吃了!
    80 做了一个包子,分2半,一人一半
    81 包子[4]来了。被[A]吃了!
    82 包子[4]来了。被[B]吃了!
    83 做了一个包子,分2半,一人一半
    84 包子[5]来了。被[A]吃了!
    85 包子[5]来了。被[B]吃了!
    86 做了一个包子,分2半,一人一半
    87 包子[6]来了。被[A]吃了!
    88 包子[6]来了。被[B]吃了!
    89 做了一个包子,分2半,一人一半
    90 包子[7]来了。被[A]吃了!
    91 包子[7]来了。被[B]吃了!
    92 做了一个包子,分2半,一人一半
    93 包子[8]来了。被[A]吃了!
    94 包子[8]来了。被[B]吃了!
    95 做了一个包子,分2半,一人一半
    96 包子[9]来了。被[A]吃了!
    97 包子[9]来了。被[B]吃了!
    协程的示例
  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/abobo/p/8110485.html
Copyright © 2011-2022 走看看