Саранча, похоже, запускает обработчик события request_success в 60 раз, чем мои реальные запросы - PullRequest
0 голосов
/ 08 января 2020

Я провожу нагрузочное тестирование с помощью Locust. Что бы это ни стоило, я также использую Graphite и Grafana для анализа результатов, но я могу создать эту проблему без загрузки или использовать любую из них в своем коде.

По своей простоте проблема может быть воспроизведена со следующим очень простым файлом саранчи:

from locust import HttpLocust, TaskSet, task, between
import locust.events


class Tasks(TaskSet):
    @task
    def make_request(self):
        self.client.get('/')
        print('doing thing')


class Locust(HttpLocust):
    wait_time = between(1, 3)
    task_set = Tasks

    def __init__(self):
        super(Locust, self).__init__()
        locust.events.request_success += self.hook_request_success

    def hook_request_success(self, request_type, name,
                             response_time, response_length):
        # This is where I would make a call to send the request's metadata to Graphite
        print("sending thing")

Вызывается так:

locust -H <host> -t 10s -c 1000 -r 10 --no-web -f test.py

Как вы можете видеть, spe c is basi c. У меня есть план с одной задачей, и я хочу выполнить один запрос, отправив результат каждого запроса в Graphite. Тем не менее, во время всех моих пробежек я получаю почти в шестьдесят (60) раз больше случаев «отправки вещи», чем «выполнения дела», когда я предполагаю, что они будут точно один в один! Я подтвердил, что функция вызывается с теми же параметрами и представляет один и тот же запрос, просто вызывается много раз для каждого «фактического» запроса, который делает саранча. Я вообще не хочу этого, я хочу отправить запрос только один раз.

Почему это так? Я что-то не так делаю?

1 Ответ

1 голос
/ 08 января 2020

Вы добавляете прослушиватель событий каждый раз, когда создаете / создаете саранчу.

Сделайте hook_request_success глобальной функцией и добавьте ее оттуда, изменив ее на что-то вроде этого:

locust.events.request_success += hook_request_success

Таким образом, он будет добавлен только один раз, что вам и нужно.

...