#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 ?