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
就這樣,實現了高並發,並且可以限制最大並發數