4-8

作者: 冰鈊夢 | 来源:发表于2019-07-10 10:46 被阅读0次

greenlet

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

安装方式

使用如下命令安装greenlet模块:

sudo pip3 install greenlet

#coding=utf-8fromgreenletimportgreenletimporttimedeftest1():whileTrue:print"---A--"gr2.switch()        time.sleep(0.5)deftest2():whileTrue:print"---B--"gr1.switch()        time.sleep(0.5)gr1 = greenlet(test1)gr2 = greenlet(test2)#切换到gr1中运行gr1.switch()

运行效果

---A--

---B--

---A--

---B--

---A--

---B--

---A--

---B--

...省略...

gevent

greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent

其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

安装

pip3 install gevent

1. gevent的使用

importgeventdeff(n):foriinrange(n):        print(gevent.getcurrent(), i)g1 = gevent.spawn(f,5)g2 = gevent.spawn(f,5)g3 = gevent.spawn(f,5)g1.join()g2.join()g3.join()

运行结果

012340123401234

可以看到,3个greenlet是依次运行而不是交替运行

2. gevent切换执行

importgeventdeff(n):foriinrange(n):        print(gevent.getcurrent(), i)#用来模拟一个耗时操作,注意不是time模块中的sleepgevent.sleep(1)g1 = gevent.spawn(f,5)g2 = gevent.spawn(f,5)g3 = gevent.spawn(f,5)g1.join()g2.join()g3.join()

运行结果

000111222333444

3. 给程序打补丁

fromgeventimportmonkeyimportgeventimportrandomimporttimedefcoroutine_work(coroutine_name):foriinrange(10):        print(coroutine_name, i)        time.sleep(random.random())gevent.joinall([        gevent.spawn(coroutine_work,"work1"),        gevent.spawn(coroutine_work,"work2")])

运行结果

work10work11work12work13work14work15work16work17work18work19work20work21work22work23work24work25work26work27work28work29

fromgeventimportmonkeyimportgeventimportrandomimporttime# 有耗时操作时需要monkey.patch_all()# 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块defcoroutine_work(coroutine_name):foriinrange(10):        print(coroutine_name, i)        time.sleep(random.random())gevent.joinall([        gevent.spawn(coroutine_work,"work1"),        gevent.spawn(coroutine_work,"work2")])

运行结果

work10work20work11work12work13work21work14work22work15work23work16work17work18work24work25work19work26work27work28work29

相关文章

  • 4-8

    74.85kg,果然涨了…… 10波比跳,15秒空中单车,10个仰卧起坐。晨练时浑身虚,练了两下洗澡去了。 早饭:...

  • 4-8

    我们总是抱怨的同时内心又期待着好处。团体操就是一个很好的证明,刚开始我们为了学分而坚持,一旦训练加强我们便一边嘴上...

  • 4-8

    旁边一女生说中医院人都这么多,我还以为人民医院人多呢。我只能心里呵呵了,估计是哪个医院人都多吧,。阴天,头脑蒙的来...

  • 4-8

    被南工爆潮社团给深深震撼了,500人的大社团,社长陈金元好帅,声音好好听,少女心爆棚。

  • 4-8

    greenlet 为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的...

  • 4-8

    美术课上老师让我们画一幅最想说的话,送给你最爱的人你的父母或者你最好的朋友,在空白处的地方画彩虹,太阳和白云。 数...

  • 4-8

    孩子有问题,立刻马上管,不要有一点让步,不然他会认为那样没错,继续错下去,而且错的一发不可收。

  • 4-8

    昨天参加日更活动。 无聊会议进行中。 离九霄而膺天命。春节看的大明王朝。我看到的是无奈,种种无奈。没有绝对的好与坏...

  • 4-8

    我们似乎每个人每天都很忙,我们也似乎工作中每天也处理了很多事情,感觉自己每天做了很多事,可是结果也产生不了什么成果...

  • 4-8

    早上记起半月前还有个事情没有办完,心里一直挂着,想了些办法,也还是没有办妥,明日一定要解决掉. 今日有体会到压力与...

网友评论

      本文标题:4-8

      本文链接:https://www.haomeiwen.com/subject/kdeckctx.html