Несколько задач и чтение пользователя и скорости вывода из конфигурационного файла Locust

#python #performance #locust

#python #Производительность #locust

Вопрос:

Как вызывать отдельные конечные точки с отдельным номером пользователей и скоростью вывода, как указано в файле конфигурации. Ниже приведен базовый код. Пожалуйста, предложите.

 from locust import HttpUser, task, between, TaskSet, User
from locust.env import Environment

class MyBase(TaskSet):
    # base class called by all client calls. 
    def getToken(self):
        return token

class GetCallTasks(MyBase):
    @task
    # Need set 1 of USer and hatch rate
    def getInfo(self):
        # verify=False get rids of InsecureRequestWarning warning
        self.client.get()

class PostAndDeleteTasks(MyBase):
    @task
    # Need set 2 of USer and hatch rate
    def deleteStatement(self):
        response = self.client.post()
        response = self.client.delete()

class ApiUser(HttpUser):
    # how do we call PostAndDeleteTasks and GetCallTasks with separate number of users and hatch rate?
    tasks = [PostAndDeleteTasks]
    tasks = [GetCallTasks]
    wait_time = between(0.100, 1.500)

if __name__ == '__main__':
    env = Environment()
    ApiUser(env).run()
  

Ответ №1:

Это зависит от вашего варианта использования и от того, что именно вы ищете. Если было бы приемлемо для каждого пользователя, который Locust генерирует для первого запуска getInfo() , а затем deleteEstatement() , вы могли бы использовать SequentialTaskSet и определить задачи, которые необходимо выполнить по порядку. Для запуска deleteEstatement() дважды его можно дублировать в двух разных задачах или одна и та же задача может просто выполнять один и тот же код дважды. В этом случае каждый пользователь будет выполнять одни и те же шаги в одном и том же порядке, и при одной постоянной скорости штриховки у вас будет постоянная скорость штриховки для обеих задач.

Если вам не нужно точное количество выполняемых задач, а просто нужно общее представление примерно о 2 deleteEstatement() для каждого 1 getInfo() , вы можете использовать веса либо для задач, либо для пользователей. Затем Locust случайным образом выберет задачу для выполнения для каждого пользователя, но, например, может иметь 2 deleteEstatement() задачи и 1 getInfo() на выбор для каждого пользователя, так что у вас будет примерно соотношение 2: 1 для определенных вами задач. Как и в первом сценарии, у вас все равно будет одна скорость штриховки для обеих задач, но точное количество запусков для каждой задачи будет немного нечетким (что обычно желательно, поскольку это часто ближе к реальному трафику).

Кроме того, в обеих этих ситуациях вы бы определили tasks в своем ApiUser классе только один раз, как tasks = [PostAndDeleteTasks, GetCallTasks] . Как у вас это есть, tasks было бы только GetCallTasks в нем, чтобы ничего в PostAndDeleteTasks никогда не запускалось.

Другой вариант — запуск 2 отдельных экземпляров Locust, только одного запущенного getInfo() и только одного запущенного deleteEstatement() . Затем вы могли бы управлять каждым из них и динамически изменять количество пользователей и скорость вывода для каждого по своему усмотрению. Это действительно единственный встроенный и поддерживаемый способ получения разных скоростей штриховки для разных наборов задач.

Но если вы действительно не хотите управлять несколькими экземплярами Locust, Locust способен запускать практически любой код и имеет несколько разных способов подключения к Locust. В документах есть пример того, что они называют пользовательскими клиентами, которые показывают вам один из способов сделать это. Ключевая часть — это self._locust_environment.events.request_success.fire() и self._locust_environment.events.request_failure.fire() , поскольку именно там код отправит Locust сообщение о том, что происходит, и была ли задача успешной или неудачной. Вы также можете перезаписать self.tasks в наборе задач либо список функций для запуска в виде задач в последовательности, либо в виде набора function: weight пар. Опять же, у этого все равно будет одно количество пользователей и скорость вывода, которые вызовут это, но тогда вы полностью контролируете то, что происходит оттуда.

И, наконец, в зависимости от того, что вам нужно сделать, есть также полезные перехватчики событий и способы использования Locust в качестве библиотеки, которые вы могли бы изучить.

Комментарии:

1. Спасибо за подробную информацию. На данный момент tasks = [PostAndDeleteTasks, GetCallTasks] подойдет. Я рассмотрю возможность добавления веса к задаче. Все еще ищу информацию locust.config.

2. Вы видели docs.locust.io/en/stable/configuration.html#configuration-file ?