使用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
就这样,实现了高并发,并且可以限制最大并发数
全世界的程序员们联合起来吧!