#locust
Вопрос:
Предположим, у меня есть 3 отдельных пользовательских класса. Я хочу выделить фиксированное количество пользователей для каждого класса. Мой код такой, как показано ниже.
class User_1(TaskSet):
# I need 3 users to execute the tasks within this user class
class User_2(TaskSet):
# I need only 1 user to execute the tasks within this user class
class User_3(TaskSet):
# I need only 1 user to execute the tasks within this user class
class API_User_Test(HttpUser):
#I already tried weighting the classes as below.
tasks = {Site_User_1: 3, User_2: 1, User_3: 1}
Я уже пробовал взвешивать классы, как показано в приведенном выше коде. Но это не работает. Иногда он выделяет более 1 пользователя для class User_2
или class User_3
. Может кто-нибудь сказать мне, как исправить эту проблему.
Ответ №1:
A weight
в Саранче-это просто статистический вес и не является гарантией. Веса определяют, сколько раз задача/пользователь помещаются в список для выбора. Когда появляется новая задача/пользователь, Locust случайным образом выбирает задачу из списка. Учитывая ваш вес:
tasks = {Site_User_1: 3, User_2: 1, User_3: 1}
Статистически говоря, появление 5 пользователей с весом 3/1/1 даст вам 3/1/1, но это может быть не так точно каждый раз. Хотя это менее вероятно, вполне возможно, что вы могли бы получить 4/0/1, или 3/2/0, или 5/0/0.
Если атрибут задачи указан в виде списка, то каждый раз, когда требуется выполнить задачу, она будет выбираться случайным образом из атрибута задачи. Если, однако, задачи — это диктант — с вызываемыми объектами в качестве ключей и int в качестве значений-задача, которая должна быть выполнена, будет выбрана случайным образом, но с соотношением int как. Итак, с задачей, которая выглядит следующим образом:
{моя задача: 3, другая задача: 1}
вероятность выполнения my_task в 3 раза выше, чем у другой задачи.
Внутренне приведенный выше дикт фактически будет расширен в список (и атрибут задачи будет обновлен), который выглядит следующим образом:
[my_task, my_task, my_task, еще одна задача]
а затем используется функция Python random.choice() для выбора задач из списка.
Если вам абсолютно необходимо иметь полный контроль над тем, какие именно пользователи работают, я бы, вероятно, рекомендовал иметь одного пользователя Locust с одной задачей, которая содержит вашу собственную логику относительно того, что запускать. Создайте свой собственный список функций для вызова и повторяйте его каждый раз при создании нового пользователя. Возможно, он должен быть внешним по отношению к пользователю как глобальный или что-то в этом роде. Но идея в том, что вы сами управляете логикой, а не Саранча.
Правка: Использование однопользовательского метода для управления тем, что выполняется, не будет хорошо работать, если вы работаете с несколькими работниками, так как работники не взаимодействуют друг с другом. Вы можете подумать о выполнении некоторых более сложных задач, таких как отправка сообщений между мастером и работниками для координации или использование внешнего источника, такого как база данных или другая служба, с которой разговаривают работники, чтобы знать, что они должны запускать.