python 协程池gevent.pool_python 并发专题(六):协程相关函数以及实现(gevent)...

一、协程实现

线程和协程

既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程:

线程之间需要上下文切换成本相对协程来说是比较高的,尤其在开启线程较多时,但协程的切换成本非常低。

同样的线程的切换更多的是靠操作系统来控制,而协程的执行由我们自己控制

我们通过下面的图更容易理解:

2b5409a453bcc14451b6c9eba09c2a73.png

21a076dba9dbbba39da85fe356ac8fa2.png

从上图可以看出,协程只是在单一的线程里不同的协程之间切换,其实和线程很像,线程是在一个进程下,不同的线程之间做切换,这也可能是协程称为微线程的原因吧

继续分析协程:

1afc16edfd34bf730cdef4b8f6e3657d.png

既然Gevent用的是Greenlet,我们通过下图来理解greenlet:

510ffa6d841926d90ecd51b5c3b9c4fe.png

每个协程都有一个parent,最顶层的协程就是man thread或者是当前的线程,每个协程遇到IO的时候就把控制权交给最顶层的协程,它会看那个协程的IO event已经完成,就将控制权给它。

from greenlet importgreenletdeftest1(x,y):

z= gr2.switch(x+y)print(z)deftest2(u):print(u)

gr1.switch(42)

gr1=greenlet(test1)

gr2=greenlet(test2)

gr1.switch("hello",'world')

greenlet(run=None, parent=None): 创建一个greenlet实例.

gr.parent:每一个协程都有一个父协程,当前协程结束后会回到父协程中执行,该 属性默认是创建该协程的协程.

gr.run: 该属性是协程实际运行的代码. run方法结束了,那么该协程也就结束了.

gr.switch(*args, **kwargs): 切换到gr协程.

gr.throw(): 切换到gr协程,接着抛出一个异常.

下面是gevent的一个例子:

importgeventdeffunc1():print("start func1")

gevent.sleep(1)print("end func1")deffunc2():print("start func2")

gevent.sleep(1)print("end func2")

gevent.joinall(

[

gevent.spawn(func1),

gevent.spawn(func2)

]

)

二、多协程

简单的多协程

importgeventdeffunc1():print("start func1")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值