Please enable JavaScript.
Coggle requires JavaScript to display documents.
Coroutine (:moneybag:实现协程的方法 (:two:greenlet (:pencil2:先做A,再做B,不断循环…
Coroutine
:moneybag:实现协程的方法
:one:生成器
:pencil2:先做A,再做B,不断循环
orris/coroutine/coroutine.py
:two:greenlet
:pencil2:先做A,再做B,不断循环
orris/coroutine/greenlet1.py
:explode:创建一个greenlet对象,它会执行参数里的代码块.之后我们用她的switch方法调用该代码块.(和生成器一样,第一次调用switch后才开始从头执行,中间switch到其他地方后再次switch回来会从上个地方继续执行)
:fire:并发的时候,程序员可以主动控制执行哪个程序,怎么切换程序
:three:gevent
:explode:遇到耗时操作(如gevent.sleep(1)),就会自动把主动权交给别人.从而形成并发
:moneybag:写服务器
:moneybag:socket
:explode:gecent.socket的accept和recv都是耗时操作.如果遇到他们而没有接收到数据,就不断切换,直到有人收到数据.
:red_cross:socket模块里的socket
:moneybag:monkey
:warning::one:monkey.patch_all()一定要写在代码上面:!!: :two:一定要用from导入
:explode:这个函数会改变下面的源代码
:explode:所有的延时, socket都要用gevent里面的代码,而不能用普通的python代码
:pencil2:使用gevent写个tcp服务器
orris/network/tcp/coroutine/
:warning::one:monkey必须用from引入,不能用gevent.monkey.patch_all(). :two:创建gevent的socket的时候,不用写AF_INET和SOCK_STREAM
:explode:开始的时候,程序只有一个协程,执行到accept的时候,没什么能切换的,就堵塞在这里. 然后收到一个客户后,就为这个客户创建一个协程,程序继续执行,执行到accept后堵塞. gevent开始自动切换到其他协程. 子协程的recv和主协程的accept只要有一方有数据就会执行它. 从而形成单进程并发
:pencil2:使用gevent写一个简单多任务程序
orris/coroutine/gevent1.py
:moneybag:计算密集型 vs IO密集型
:moneybag:计算密集型
:moneybag:多进程
:fire:需要占用大量CPU资源
:moneybag:IO密集型
:fire::one:大部分时间在睡觉(等待网络数据到来) :two:需要网络功能
:moneybag:多线程
:explode:大部分时间在等待,对于python来说一个核就够用
:moneybag:协程
:fire:减少CPU切换时间,效率高
:explode:CPU在执行并发任务时,是在不同进程/线程间切换,而不同进程/线程需要对应的上下文资源,所以CPU在切换时要不停保存/恢复这些上下文.而协程因为就一个进程一个线程占用,所以CPU不用切换这些上下文(如果是切换函数的话,就只需要保存函数的本地变量等
:explode:一个进程可以分多个线程,一个线程再继续分,就是协程.(微线程).她的本质是使用生成器实现,就是先执行我的一些代码块,之后再执行A的代码块,然后又执行我的代码块,之后又执行A的代码块,以此循环