多任务5--gevent完成多任务及monkey补丁

心不动则不痛 提交于 2019-11-28 05:51:28

代码:

 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

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!