Как запустить Master / Slave Runner программно, чтобы в конце останавливались подчиненные - PullRequest
2 голосов
/ 15 марта 2020

У меня есть простые сценарии master / slave, использующие locustio==0.13.5. Это ведущее устройство:

#!/usr/bin/env python3

import logging
import argparse
import os
import sys
import time

import urllib3

import locust

import utils


class TestSomething(locust.TaskSet):
    @locust.task(1)
    def get_hosts_small(self):
        print(self.locust.message)
        return self.client.get(url='http://localhost', verify=False)

class TheSomething(locust.HttpLocust):
    task_set = TestSomething
    wait_time = locust.constant(0)


urllib3.disable_warnings()
logging.basicConfig(level=logging.DEBUG)

options = argparse.Namespace()
options.host = "http://localhost"
options.num_clients = 1
options.hatch_rate = options.num_clients
options.num_requests = 10
options.stop_timeout = 1
options.step_load = False
options.reset_stats = False
options.test_duration = 3

options.master_host = 'localhost'
options.master_port = 5557
options.master_bind_host = '*'
options.master_bind_port = 5557
options.heartbeat_liveness = 3
options.heartbeat_interval = 1

options.expect_slaves = 1


test_set = TheSomething
test_set.message = 'Hello'

locust_runner = locust.runners.MasterLocustRunner([test_set], options)
while len(locust_runner.clients.ready) < options.expect_slaves:
    logging.info("Waiting for slaves to be ready, %s of %s connected", len(locust_runner.clients.ready), options.expect_slaves)
    time.sleep(1)

locust_runner.start_hatching(locust_count=options.num_clients, hatch_rate=options.hatch_rate)
time.sleep(options.test_duration)
locust_runner.quit()
locusts.events.quitting.fire(reverse=True)

print(locust_runner.stats)   # actually using custom function to format results

, а это подчиненное устройство:

#!/usr/bin/env python3

import logging
import argparse
import os
import sys
import time

import locust


class TestSomething(locust.TaskSet):
    @locust.task(1)
    def get_hosts_small(self):
        print(self.locust.message)
        return self.client.get(url='http://localhost', verify=False)

class TheSomething(locust.HttpLocust):
    task_set = TestSomething
    wait_time = locust.constant(0)


logging.basicConfig(level=logging.DEBUG)

options = argparse.Namespace()
options.host = "http://localhost"
options.num_clients = 1
options.hatch_rate = options.num_clients
options.num_requests = 10
options.stop_timeout = 1
options.step_load = False
options.reset_stats = False
options.test_duration = 3

options.master_host = 'localhost'
options.master_port = 5557
options.master_bind_host = '*'
options.master_bind_port = 5557
options.heartbeat_liveness = 3
options.heartbeat_interval = 1


test_set = TheSomething
test_set.message = 'Hello'

locust_runner = locust.runners.SlaveLocustRunner([test_set], options)
locust_runner.worker()

Когда я запускаю ведущее устройство и ведомое устройство, я вижу, как ведущее устройство ожидает подъёма подчиненного устройства, затем как подчиненный выполняет тест, и я вижу отчет, напечатанный мастером до его завершения. Но slave не завершает работу - он зависает, работает, ничего не делая (я полагаю).

Я бы хотел, чтобы slave либо вышел, либо перезапустился и попытался снова подключиться к master в случае, если я просто перезапущу мастер-скрипт. Кто-нибудь знает, как это сделать, пожалуйста?

1 Ответ

2 голосов
/ 16 марта 2020

Обычно я просто устанавливаю любые параметры в качестве переменных среды и считываю их из скрипта (os.environ ['MY_ENV_VAR']) *

Если вы используете ведомые на одном сервере, это должно быть легко ( просто запустите export MY_ENV_VAR=Hello перед запуском процессов), если вы работаете с ведомыми на разных машинах, это будет немного сложнее, но посмотрите, как работает locust-swarm (https://github.com/SvenskaSpel/locust-swarm)

Что касается "делать вещи после теста", то есть событие "выход", на которое вы можете подписаться:

https://docs.locust.io/en/0.14.5/api.html#available -hooks

Или для следующей версии 1.0:

https://docs.locust.io/en/latest/api.html#locust .event.Events.quitting

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...