• 使用gevent实现高并发并限制最大并发数


    import time
    import gevent
    from gevent.pool import Pool
    from gevent import monkey
    # 一,定义最大并发数
    p = Pool(20)
    # 二,导入gevent猴子补丁,没有它,协称就不会并发执行
    
    monkey.patch_all()
    
    
    #  三,耗时任务或者阻塞任务,异步执行的或者需要并发的就是它了
    def task(i):
        time.sleep(i)
        print("----这里---------")
    
    
    # 四,任务派发,将15个任务派发给协程去做
    threads = [p.spawn(task, 5) for i in range(15)]
    
    # 五,在此阻塞,等所有协程全部完成退出,这一步才执行完
    gevent.joinall(threads)

     以上demo代码,就实现了:最大并发数20,超过20个并发,排队等待;

    上述代码中,单个协程耗时五秒,那么并发15个,全部耗时,应该也是5秒多一点点。加入一个时间,来看看是不是真的。比如

    import time
    import gevent
    from gevent.pool import Pool
    from gevent import monkey
    # 一,定义最大并发数
    p = Pool(20)
    # 二,导入gevent猴子补丁,没有它,协称就不会并发执行
    
    monkey.patch_all()
    
    
    #  三,耗时任务或者阻塞任务,异步执行的或者需要并发的就是它了
    def task(i):
        time.sleep(i)
        print("----这里---------")
    
    time_l=time.time()
    # 四,任务派发,将15个任务派发给携程去做
    threads = [p.spawn(task, 5) for i in range(15)]
    
    # 五,在此阻塞,等所有协程全部完成退出,这一步才执行完
    gevent.joinall(threads)
    
    time_r=time.time()
    print("总耗时:{}".format(time_r-time_l))

    执行结果:

    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    ----这里---------
    总耗时:5.004504919052124
    
    Process finished with exit code 0
    

     就这样,实现了高并发,并且可以限制最大并发数

  • 相关阅读:
    九度oj 题目1371:最小的K个数
    九度oj 题目1131:合唱队形
    九度oj 题目1450:产生冠军
    九度oj 题目1135:字符串排序
    九度oj 题目1534:数组中第K小的数字
    九度oj 题目1179:阶乘
    九度oj 题目1369:字符串的排列
    九度oj 题目1100:最短路径
    [Luogu] 子串
    [Luogu] 魔法树
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/12899948.html
Copyright © 2020-2023  润新知