python使用第三方库gevent模拟高并发请求

因为工作中有个测试场景需要在1s内发送100个请求,需要并发,本来想用多线程或协程实现的,但最后发现gevent这个第三方库,真的很好用。
当然也可以使用concurrent.futures模块或者asyncio包实现高并发

gevent简介:
gevent在python后台开发中是必不可少的工具库,它的强大在于它能使同步的python代码在IO等待时间挂起,并执行其它任务,达到异步的运行效果,从而提高程序的运行效率,达到高并发的功能。

PS: 期待我后面的文章讲解如何在生产环境正确使用gevent大幅度提高服务器性能吧:>)

廖雪峰的python教程是这样说的:
gevent是第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,
等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,
经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,
而不是等待IO。

官方文档介绍如下:
gevent是一个基于libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。

直接上代码:

from gevent import monkey
import gevent
import requests

monkey.patch_socket()   # 实现高并发,这个猴子补丁是必须的

n = 100  # 并发数量

def worker(i):
    """执行任务"""
	resp = requests.get(url)
    if resp.response_code == 200:
    	print(f'the {i} time request end')
        
               
def run():
    """开始运行"""
    workers = [gevent.spawn(worker, i) for i in range(n)]   # 传参数i
    gevent.joinall(workers)  # 等所有请求结束后退出,类似线程的join
    print('Done!')


if __name__ == "__main__":
    run()

但是上面的请求有个问题是,100次的并发请求是瞬间就发出去的,和我们的1s钟刚好发送100个请求不符合,这时,可以使用gevent.spawn_later() 实现定时发送,就是上一个请求和下一个请求之间隔了1/100秒,这样就正好1s发送了100个请求
代码如下:

from gevent import monkey
import gevent
import requests

monkey.patch_socket()   # 实现高并发,这个猴子补丁是必须的

n = 100  # 并发数量

def worker(i):
    """执行任务"""
	resp = requests.get(url)
    if resp.response_code == 200:
    	print(f'the {i} time request end')
        
               
def run():
    """开始运行"""
    workers = [gevent.spawn_later(i/n, worker, i) for i in range(n)]   # 其实和上面的代码就这里不一样
    gevent.joinall(workers)  # 等所有请求结束后退出,类似线程的join
    print('Done!')


if __name__ == "__main__":
    run()

代码解析: gevent.spawn_later函数中的 i/n 参数就是等待的秒数,如果是固定的值如10,则意思是10秒后才发送高并发请求,但如果是i/n,则代表每个请求之间间隔1/n秒,所有请求发完就是一秒,如果你想在2s钟发完请求,那就是2/n。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值