python猴子补丁_python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch

协程工作的特点是遇到阻塞或耗时的任务时就切换,协程的生存依赖于线程,线程依赖于协程

一个似乎有点问题的例子

import gevent,time

def kisscpc(num):for i inrange(num):

print ("吻了第%s下陈培昌"%(i+1),gevent.getcurrent())

time.sleep(1)

def kisscj(num):for i inrange(num):

print ("吻了第%s下程劲"%(i+1),gevent.getcurrent())

time.sleep(1)

def kissxxd(num):for i inrange(num):

print ("吻了第%s下徐晓冬"%(i+1),gevent.getcurrent())

time.sleep(1)

g1= gevent.spawn(kisscj,3)

g2= gevent.spawn(kisscpc,2)

g3= gevent.spawn(kissxxd,5)

g1.join()

g2.join()

g3.join()

输出结果:

吻了第1下程劲 吻了第2下程劲吻了第3下程劲吻了第1下陈培昌吻了第2下陈培昌吻了第1下徐晓冬吻了第2下徐晓冬吻了第3下徐晓冬吻了第4下徐晓冬吻了第5下徐晓冬

貌似这样的结果并未能达到我们所期待的并发效果,任务仍旧是按部就班的执行。答案在于使用gevent时,相关的一切都要更换成gevent的

耗时,阻塞部分换成gevent库的实现

import gevent,time

def kisscpc(num):for i inrange(num):

print ("吻了第%s下陈培昌"%(i+1),gevent.getcurrent())

#time.sleep(1)

gevent.sleep(1)

def kisscj(num):for i inrange(num):

print ("吻了第%s下程劲"%(i+1),gevent.getcurrent())

#time.sleep(1)

gevent.sleep(1)

def kissxxd(num):for i inrange(num):

print ("吻了第%s下徐晓冬"%(i+1),gevent.getcurrent())

#time.sleep(1)

gevent.sleep(1)

g1= gevent.spawn(kisscj,3)

g2= gevent.spawn(kisscpc,2)

g3= gevent.spawn(kissxxd,5)

g1.join()

g2.join()

g3.join()

输出结果:

吻了第1下程劲 吻了第1下陈培昌吻了第1下徐晓冬吻了第2下程劲吻了第2下陈培昌吻了第2下徐晓冬吻了第3下程劲吻了第3下徐晓冬吻了第4下徐晓冬吻了第5下徐晓冬

哟比~这才是我们期盼的!

但是,对于一些早期的代码,每个任务的耗时部分仍有可能采用了常规的代码写法(而不是gevent.方法名),这就意味着,我们需要改动代码的绝大多数部分

这时,猴子补丁就派上用场了

import gevent,timefromgevent import monkey

monkey.patch_all()

def kisscpc(num):for i inrange(num):

print ("吻了第%s下陈培昌"%(i+1),gevent.getcurrent())

time.sleep(1)

#gevent.sleep(1)

def kisscj(num):for i inrange(num):

print ("吻了第%s下程劲"%(i+1),gevent.getcurrent())

time.sleep(1)

#gevent.sleep(1)

def kissxxd(num):for i inrange(num):

print ("吻了第%s下徐晓冬"%(i+1),gevent.getcurrent())

time.sleep(1)

#gevent.sleep(1)

g1= gevent.spawn(kisscj,3)

g2= gevent.spawn(kisscpc,2)

g3= gevent.spawn(kissxxd,5)

g1.join()

g2.join()

g3.join()

输出结果:

吻了第1下程劲 吻了第1下陈培昌吻了第1下徐晓冬吻了第2下程劲吻了第2下陈培昌吻了第2下徐晓冬吻了第3下程劲吻了第3下徐晓冬吻了第4下徐晓冬吻了第5下徐晓冬

我们看到仅仅用了monkey.patch_all()就达到了期待的效果,而其他方面几乎没什么改变

原文:https://www.cnblogs.com/saintdingspage/p/11622740.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值