Locust中wait_time中匿名函数使用方法浅析

本文分析了Locust框架中如何使用lambda函数实现随机和恒定等待时间,以及其原理。通过仿写和拆解代码,解释了如何将函数作为类属性转化为实例方法,使得用户可以在任务中动态设置等待时间。
摘要由CSDN通过智能技术生成

前言

翻出之前做个压测项,看到locust中对等待时间的实现方式感到好奇,于是总结下来。

源代码实现

def between(min_wait, max_wait):
    """
    Returns a function that will return a random number between min_wait and max_wait.

    Example::

        class MyUser(User):
            # wait between 3.0 and 10.5 seconds after each task
            wait_time = between(3.0, 10.5)
    """
    return lambda instance: min_wait + random.random() * (max_wait - min_wait)


def constant(wait_time):
    """
    Returns a function that just returns the number specified by the wait_time argument

    Example::

        class MyUser(User):
            wait_time = constant(3)
    """
    return lambda instance: wait_time

可以看到locust中对等待时间的处理是先返回一个匿名函数,然后在一个类中 wait_time = constant(3),再在task类中调用wait_time()返回一个具体的等待时间

def wait(self):
    """
    Make the running user sleep for a duration defined by the Locust.wait_time
    function (or TaskSet.wait_time function if it's been defined).

    The user can also be killed gracefully while it's sleeping, so calling this
    method within a task makes it possible for a user to be killed mid-task, even if you've
    set a stop_timeout. If this behaviour is not desired you should make the user wait using
    gevent.sleep() instead.
    """
    if self.user._state == LOCUST_STATE_STOPPING:
        raise StopUser()
    self.user._state = LOCUST_STATE_WAITING
    self._sleep(self.wait_time())
    if self.user._state == LOCUST_STATE_STOPPING:
        raise StopUser()
    self.user._state = LOCUST_STATE_RUNNING

def _sleep(self, seconds):
    gevent.sleep(seconds)

写法的原理探究

我们先自己仿写一下代码

def call_fuc():
    return lambda x: print(x)
    
class User:
    x = call_fuc()
    
u = User()
u.x()    

在这里插入图片描述
看到当我们执行的时候,就会执行返回的匿名函数的逻辑打印一个类对象

拆解函数

对于不熟悉lambda函数的人来说理解这段函数可能有点绕,所以我们拆解一下

def call_fuc():
    # return lambda x: print(x)
    def lam(x):
        print(x)

在上面可以看到返回了一个函数给类属性所以x = call_fuc(),x就成了一个方法了,方法接收一个形参x,接收一个参数x,又是在类里面,这不是就是成了一个实例方法吗,在类里面我们约定俗成把第一个参数叫做self,但是Python本身没有对命名做要求所以在这里x = self。重新定义一个实例方法

class User:
    x = call_fuc()

    def lam(x):
        print(x)

        
u = User()
u.lam()
u.x()  

输出结果
在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值