使用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

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

 

上一篇:python – gevent.wait和gevent.joinall有什么区别?


下一篇:python-48-协程