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
    

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

  • 相关阅读:
    MyBatis 框架系列之基础初识
    从零开始实现在线直播
    面试中关于Redis的问题看这篇就够了
    Spring Boot 中使用 MyBatis 整合 Druid 多数据源
    MyBatis的foreach语句详解
    小结:“服务器端跳转”和“客户端跳转”的区别
    Centos7.3安装vsftp服务
    Spring 注解@Value详解
    Spring中@Bean与@Configuration
    数据结构之LinkList
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/12899948.html
Copyright © 2011-2022 走看看