+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(47)

2019-09(90)

2019-10(13)

2019-11(9)

2019-12(19)

协程

发布于2020-08-29 17:51     阅读(497)     评论(0)     点赞(3)     收藏(0)


0

1

2

3

4

协程

​ 协程简单的说就是在单线程下实现并发的效果的状态。协程实际是并不存在的事物,这是人们通过模拟cpu运行的方式,让单线程也能实现并发而创造的。

​ 我们可以想一下cpu在遇到多个任务时是怎么做的。其实本质就是在多个任务之间来回的进行切换,由于cpu的切换速度过快,导致我们感受到仿佛一直在工作,现在我们就要模仿这个过程,让一个线程在遇到io操作的时候进行切换 ,去完成另一个任务,这与线程和进程的做法是一致的,唯一的区别就是这是由我们认为控制的,而线程于进程是由操作系统帮助我们控制的。

​ 值得一提的是,由于协程是完全由我们自己控制的,所以效率是远超进程与线程的,因为操作系统本身并不是只有一个进程。

做法

#greenlet
from greenlet import greenlet


def eat():
    print('eat1')
    g2.switch()
    print('eat2')
    g2.switch()

def play():
    print('play1')
    g1.switch()
    print('play2')

g1 = greenlet(eat)
g2 = greenlet(play)

g1.switch() # 代表切换到哪个任务

greenlet可以帮助我们切换任务,但是greenlet并不能做到的事情是识别io操作,他遇到io操作只会停留在原地等待io操作结束。

而接下来的gevent模块则是在基于greenlet模块之上实现了识别io操作的功能

import time
from gevent import monkey,spawn,joinall;monkey.patch_all()
# monkey monkey.patch_all()猴子补丁,保证能识别所有的io操作

def eat():
    print('eat1')
    time.sleep(2) # 模拟io操作的时间
    print('eat2')

def play():
    print('play1')
    time.sleep(3)
    print('play2')

if __name__ == '__main__':
    s1 = spawn(eat) # 创建一个实现eat任务的对象
    s2 = spawn(play)
    joinall([s1,s2]) # 因为上述是异步的,所以保证线程不会再任务运行前结束

原文链接:https://blog.csdn.net/qq_43379243/article/details/108232637

0

1

2

3

4



所属网站分类: 技术文章 > 博客

作者:dfh8374

链接: https://www.pythonheidong.com/blog/article/498231/1c9b9cde7466f6e97deb/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)