• 多任务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
    

      

  • 相关阅读:
    Codeforces Gym
    洛谷试炼场一句话题解
    优先队列板子
    BZOJ 3524 [POI2014] Couriers/洛谷3567(可持久化线段树)
    hdu 4417 Super Mario(可持久化线段树)
    poj 2559 Largest Rectangle in a Histogram (单调栈)
    zoj 4019 Schrödinger's Knapsack
    hdu 1521 排列组合(指数型生成函数板子)
    hdu 2072 单词数(普通型生成函数板子)
    RabbitMQ广播:direct模式
  • 原文地址:https://www.cnblogs.com/yifengs/p/11395491.html
Copyright © 2020-2023  润新知