4-8

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)