locust之协程(2)

16 篇文章 ¥19.90 ¥99.00
本文介绍了Python的生成器,包括其优点、工作原理和与列表解析式的区别。接着,详细讲解了yield的使用,如next、send和__next__方法。文章还探讨了yield from的用法,解释了它如何从子生成器中生成结果,并通过实例展示了其迭代性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

生成器介绍

yield使用

yield from的用法


 

  • 生成器介绍

生成器是拿来干嘛的?没有生成器之间,我们有一个东西叫列表解析式,说白了,就类似如下:

a=[i for i in range(999999)]

它有啥优点?适合新人入门,运行速度快,易于编写。但缺点呢?我们可以理解为一下子生成了整个列表并加载到内存中。

也就是吃内存,后面的同步代码要等你加载完才能运行。

那再说生成器,一个是带个yield就搞定,一个是圆括号形式,就是如上的中括号换成圆括号,如下:

a=(i for i in range(999999))

本质就是,它自带了一个"return"。这个return每次只返回一个对象。它不会一次性构建整个列表,而是通过迭代的方式去惰性的加载。打个比方就是。所有的包子都做好了,但是有人下单,我才会去烤箱加热,然后卖出去。而不是全部先放蒸笼保温,那样我的蒸笼(内存)就那么大,我就不能腾出空间(cpu,内存)去做其他事情了。所以它做了2件事情:保存运行的状态,返回值.

我们来看看a是什么:

 返回的是一个迭代器,也就是它不会返回给你一个具体的结果,并且它本质就是一个迭代器。你需要调用for循环来迭代输出,而for循环就自动帮你调用了next函数来迭代输出。而yield也是如此。不外乎隐式或者显式的调用next。

  • yield使用

yield相关我们常用的有next,send,__next__,close等

next和__next__的作用就是按需取下一个值。close就是销毁了这个生成器。send的作用是给yield的左边传参。当然第一次调用的时候,因为yield的执行顺序是先右边再左边,所以,我们遇到yield就停止了运行,此时send是无法给左边赋值的,那我们第一次调用只能send(None)。send其他就给next保持一致了。我们这里举个小小的例子吧

def gen_test():
    value = 0
    while True:
        s = yield value
        print('s=', s)
        value += 1


m = gen_test()
m.send(None)
for i in range(10):
    m.send(i)
    

 

下面我们运行看看效果:

这里我们每次有个参数s,它是用来接收send传值的。

至于为什么第一次使用None进行传值,是因为第一次我们遇到yield就会暂停。而并没有进行赋值操作。所以我们传None。

当然,这只是我们的猜测,具体是不是赋值是在第二次完成,我们可以进行一个小小的实验看看效果。

 

def gen_test():
    value = 0
    while True:
        s = yield value
        print('s=', s)
        value += 1



m = gen_test()
m.send(None)
print('进行第二次send!')
m.send(1)

OK,看输出结果。确实是在第二次send的时候我们才能接收到send的值,而第一次必须传None,我们从他的祖先去看看。

OK,看了下它的底层,确实是必须在一个生成器第一次迭代的时候必须传None。

  • yield from的用法

下面介绍下yield from。要用yield from,一样的,需要实现__iter__和__next__ 方法,至于为什么他们对照的是for循环和next。则是对接的相应的协议,这里我们就无须深究了。

我们先看看它是否包含了这2个方法。依然是通过代码来举例:

def gen_test(args):
    yield from args

if __name__ == '__main__':
    s = gen_test('abc')
    print(list(s))
    iter_index = dir(s).index('__iter__')
    next_index = dir(s).index('__next__')
    print(dir(s)[iter_index])
    print(dir(s)[next_index])

看看结果;

没问题,它依然是个生成器 。这里我们看成2个单词来理解,yield,from。第一个动作是生成,第二个动作是从的意思。

合在一起,我们可以理解为从哪里产生结果。

yield是直接生成,而yield from则是从子生成器里生成。因为它具有迭代的性质,如果我们还是可以通过迭代的方式来输出。

这里的从哪里生成我们就可以理解为:

def gen_from(*args):
    for items in args:
        for item in items:
            yield item

这里我们只是简化成了如下

def gen(*args):
    for item in args:
        yield from item 

 

<think>好的,用户想了解Locust性能测试工具的介绍和使用方法。首先,我需要回忆一下关于Locust的基本信息。Locust是一个用Python编写的开源性能测试工具,主要用于负载测试,评估应用程序的性能。它的特点包括可扩展性和易用性,用户可以用Python脚本定义用户行为,这比传统工具更灵活。 接下来,用户可能需要知道Locust的核心原理。根据引用[1],Locust基于协程而不是线程或进程,这使得它能高效模拟大量并发用户。每个用户行为由Python协程处理,资源消耗低,适合高并发场景。此外,Locust采用主从架构,支持分布式压测,可以横向扩展以生成更大负载。 然后,使用方法部分需要分步骤说明。首先安装,引用[2]提到使用pip安装locust。然后编写测试脚本,用户需要创建一个类继承HttpUser,定义任务集合和权重。任务可以是用@task装饰器标记的方法。启动测试通过命令行执行locust -f script.py,之后访问Web界面配置并发用户数、生成速率和主机地址。监控结果时,Web界面会实时显示RPS、响应时间、失败率等指标,测试结束后生成报告。不过引用[3]指出报告可能较简陋,需要二次开发定制详细信息,这点需要提及。 用户可能还关心优缺点。优点包括灵活的脚本编写、分布式支持、实时监控和开源免费。缺点如报告不够详细,缺乏资源监控,需要额外开发,这也是引用[3]提到的内容。 最后,根据系统级指令,需要生成相关问题。可能的问题包括Locust与其他工具(如JMeter)的对比,如何提高测试精度,分布式部署的具体步骤,以及如何扩展Locust的功能。这些问题可以帮助用户进一步探索Locust的应用和优化。</think>### Locust性能测试工具介绍与使用方法 #### 一、Locust简介 Locust 是一款基于 Python 的开源性能测试工具,专为负载测试和评估应用程序性能而设计。其核心优势在于**脚本化的用户行为模拟**和**分布式压测支持**,允许通过代码灵活定义复杂的测试场景[^1]。 #### 二、核心原理 1. **协程驱动**:采用轻量级协程(而非线程或进程),支持高并发用户模拟,单机可模拟数千用户[^1]。 2. **主从架构**:通过主节点(Master)协调多个从节点(Worker),实现分布式压测扩展。 3. **实时监控**:Web界面提供实时统计信息,包括请求速率(RPS)、响应时间和失败率。 #### 三、使用方法(基础示例) 1. **安装**: ```bash pip install locust ``` 2. **编写测试脚本**(demo.py): ```python from locust import HttpUser, task, between class WebsiteUser(HttpUser): wait_time = between(1, 3) # 用户操作间隔时间 @task(3) # 权重为3的任务 def visit_homepage(self): self.client.get("/") @task(1) # 权重为1的任务 def search_product(self): self.client.post("/search", {"keyword": "laptop"}) ``` 3. **启动测试**: ```bash locust -f demo.py ``` 4. **Web界面操作**: - 访问 `http://localhost:8089` - 设置并发用户数(Number of users) - 指定用户生成速率(Spawn rate) - 输入被测系统地址(Host) 5. **结果监控**: - 实时查看RPS、响应时间分布(P50/P95/P99)、失败请求数 - 导出CSV格式测试报告[^2] #### 四、优缺点对比 | 优势 | 局限性 | |------|--------| | ✔️ 脚本灵活可编程 | ❌ 报告可视化功能较弱[^3] | | ✔️ 支持分布式压测 | ❌ 缺乏服务器资源监控 | | ✔️ 低资源消耗 | ❌ 需Python编程基础 | #### 五、典型应用场景 1. API接口压力测试 2. 电商秒杀活动容量验证 3. 微服务架构的极限负载测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值