zoukankan      html  css  js  c++  java
  • 使用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
    

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

  • 相关阅读:
    ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) (转载)
    获取页面得所有控件
    标题: 如何断开与另一台机器的连接(更换用户名和口令)
    C#数据类型及范围
    常用数学符号读法大全
    理解偏序关系
    理解全序关系
    理解拟序关系
    《离散数学》双语专业词汇表 名词术语中英文索引
    ORL人脸库
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/12899948.html
Copyright © 2011-2022 走看看