多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁

代码:

 1 import gevent
 2 
 3 
 4 def f1(n):
 5     for i in range(n):
 6         print(gevent.getcurrent(),i)
 7         gevent.sleep(1)
 8 
 9 def f2(n):
10     for i in range(n):
11         print(gevent.getcurrent(),i)
12         gevent.sleep(0.1)
13 
14 
15 def f3(n):
16     for i in range(n):
17         print(gevent.getcurrent(),i)
18         gevent.sleep(0.2)
19 
20 
21 print("---1---")
22 # gevent比greenlet好的地方是,遇到sleep自动切换,但是不支持time.sleep(),支持gevent.sleep()
23 # 不止是sleep,但凡延时或者堵塞的东西全要换成gevent里面的
24 g1 = gevent.spawn(f1,5)
25 print("---2---")
26 g2 = gevent.spawn(f2,5)
27 print("---3---")
28 g3 = gevent.spawn(f3,5)
29 print("---4---")
30 g1.join()
31 g2.join()
32 g3.join()

结果:

---1---
---2---
---3---
---4---
<Greenlet at 0x1ba58dbc648: f1(5)> 0
<Greenlet at 0x1ba58dbc948: f2(5)> 0
<Greenlet at 0x1ba58dbca48: f3(5)> 0
<Greenlet at 0x1ba58dbc948: f2(5)> 1
<Greenlet at 0x1ba58dbca48: f3(5)> 1
<Greenlet at 0x1ba58dbc948: f2(5)> 2
<Greenlet at 0x1ba58dbc948: f2(5)> 3
<Greenlet at 0x1ba58dbca48: f3(5)> 2
<Greenlet at 0x1ba58dbc948: f2(5)> 4
<Greenlet at 0x1ba58dbca48: f3(5)> 3
<Greenlet at 0x1ba58dbca48: f3(5)> 4
<Greenlet at 0x1ba58dbc648: f1(5)> 1
<Greenlet at 0x1ba58dbc648: f1(5)> 2
<Greenlet at 0x1ba58dbc648: f1(5)> 3
<Greenlet at 0x1ba58dbc648: f1(5)> 4

  

这种比较麻烦,如果源代码里面用到time.sleep()或者socket中的堵塞,一个一个改会很麻烦,所以有了gevent的补丁

代码:

 1 import gevent
 2 import time
 3 from gevent import monkey
 4 
 5 
 6 monkey.patch_all()
 7 
 8 def f1(n):
 9     for i in range(n):
10         print(gevent.getcurrent(),i)
11         time.sleep(1)
12 
13 
14 def f2(n):
15     for i in range(n):
16         print(gevent.getcurrent(),i)
17         time.sleep(0.1)
18 
19 
20 def f3(n):
21     for i in range(n):
22         print(gevent.getcurrent(),i)
23         time.sleep(0.2)
24 
25 
26 # print("---1---")
27 # # gevent比greenlet好的地方是,遇到sleep自动切换,但是不支持time.sleep(),支持gevent.sleep()
28 # # 不止是sleep,但凡延时或者堵塞的东西全要换成gevent里面的
29 # g1 = gevent.spawn(f1,5)
30 # print("---2---")
31 # g2 = gevent.spawn(f2,5)
32 # print("---3---")
33 # g3 = gevent.spawn(f3,5)
34 # print("---4---")
35 # g1.join()
36 # g2.join()
37 # g3.join()
38 # 一个一个join()很麻烦,可以放到joinall()的列表中
39 gevent.joinall([
40     gevent.spawn(f1,5),
41     gevent.spawn(f2,5),
42     gevent.spawn(f3,5)
43 
44 ])

结果不变:

<Greenlet at 0x1a159007048: f1(5)> 0
<Greenlet at 0x1a159007248: f2(5)> 0
<Greenlet at 0x1a159007348: f3(5)> 0
<Greenlet at 0x1a159007248: f2(5)> 1
<Greenlet at 0x1a159007348: f3(5)> 1
<Greenlet at 0x1a159007248: f2(5)> 2
<Greenlet at 0x1a159007248: f2(5)> 3
<Greenlet at 0x1a159007348: f3(5)> 2
<Greenlet at 0x1a159007248: f2(5)> 4
<Greenlet at 0x1a159007348: f3(5)> 3
<Greenlet at 0x1a159007348: f3(5)> 4
<Greenlet at 0x1a159007048: f1(5)> 1
<Greenlet at 0x1a159007048: f1(5)> 2
<Greenlet at 0x1a159007048: f1(5)> 3
<Greenlet at 0x1a159007048: f1(5)> 4

  

原文地址:https://www.cnblogs.com/yifengs/p/11395491.html