码迷,mamicode.com
首页 > 编程语言 > 详细

进程、线程、协程(协程篇)

时间:2018-12-24 22:35:37      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:阶段   ret   传递   生成器   send   存在   none   range   简单   

什么是协程?

  首先,先说一个前提:子程序/函数:在所有语言中都是层级调用的,比如A调用B。在B执行过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后是A执行完毕返回。是通过栈实现的,一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用的顺序是明确的。

  然后就是协程的概念:

  看上去也是子程序,但执行过程中,在子程序的内部可终端,然后转而执行别的子程序,不是函数调用

# 协程
def
C(): print(C--start) print(C--end) def B(): print(B--start) C() print(B--end) def A(): print(A--start) B() print(A--end) A() # 协程的特点就是一个只有一个线程在执行,协程的执行效率极高 # 因为只有一个线程,也不存在同时写变量的冲突,在协程中共享资源不加锁,只需要判断状态
# 协程原理
# python 对协程的支持是通过generator实现的
def run():
    print(1)
    yield 10
    print(2)
    yield 20
    print(3)
    yield 30
# 协程的最简单风格,控制函数的阶段执行,节约协程或者进程的切换
# 返回只是一个生成器
m = run()
print(next(m))
print(next(m))
print(next(m))
# 数据传输
def run():
    # 空变量,储存的作用data始终为空
    data = ‘‘   # 第一次执行的
    r = yield data   # 出去r=,后面也是第一次执行的;第一次执行,传递进来个空值,返回为空
    # r = a
    print(1, r, data) # 第二次传递进来的a
    r = yield data     # 第二次返回一个空
    # r = b
    print(2, r, data)
    r = yield data
    # r = c
    print(3, r, data)
    r = yield data
m = run()
print(m.send(None))
print(m.send(a))
print(m.send(b))
print(m.send(c))
# 生产者与消费者
def product(a):
    a.send(None)
    for i in range(5):
        print(生产者与消费者)
        r = a.send(str(i))
        print(消费者消费了数据{}.format(r))
    a.close()
def customer():
    data = ‘‘
    while True::
        n = yield data
        if not n:
            return
        print(消费者消费了{}。format(n))
        data = 200
c = customer()
product(c)

 

进程、线程、协程(协程篇)

标签:阶段   ret   传递   生成器   send   存在   none   range   简单   

原文地址:https://www.cnblogs.com/zpstu/p/10171315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!