locust 2.46.7.dev11__tar.gz → 2.46.7.dev17__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/PKG-INFO +1 -1
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/_version.py +2 -2
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/dispatch.py +3 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/task.py +2 -2
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/users.py +1 -1
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/wait_time.py +5 -3
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/.gitignore +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/LICENSE +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/README.md +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/hatch_build.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/__init__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/__main__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/argument_parser.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/clients.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/__init__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/dns.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/fasthttp.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/milvus.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/mongodb.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/mqtt.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/oai.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/postgres.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/qdrant.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/contrib/socketio.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/debug.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/env.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/event.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/exception.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/html.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/input_events.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/log.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/main.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/opentelemetry.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/py.typed +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/rpc/__init__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/rpc/protocol.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/runners.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/shape.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/stats.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/__init__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/inspectuser.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/markov_taskset.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/user/sequential_taskset.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/__init__.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/cache.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/date.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/deprecation.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/directory.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/exception_handler.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/load_locustfile.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/rounding.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/timespan.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/util/url.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/web.py +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/auth.html +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/index.html +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/locust/webui/dist/report.html +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/pyproject.toml +0 -0
- {locust-2.46.7.dev11 → locust-2.46.7.dev17}/pytest_locust/plugin.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.46.7.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 46, 7, '
|
|
21
|
+
__version__ = version = '2.46.7.dev17'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 46, 7, 'dev17')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -195,6 +195,9 @@ class UsersDispatcher(Iterator):
|
|
|
195
195
|
if target_user_count < 0:
|
|
196
196
|
raise ValueError(f"target_user_count must be >= 0, got {target_user_count}")
|
|
197
197
|
|
|
198
|
+
if spawn_rate <= 0:
|
|
199
|
+
raise ValueError(f"spawn_rate must be > 0, got {spawn_rate}")
|
|
200
|
+
|
|
198
201
|
if user_classes is not None and self._user_classes != sorted(user_classes, key=attrgetter("__name__")):
|
|
199
202
|
self._user_classes = sorted(user_classes, key=attrgetter("__name__"))
|
|
200
203
|
self._user_generator = self._user_gen()
|
|
@@ -14,7 +14,7 @@ import random
|
|
|
14
14
|
import traceback
|
|
15
15
|
from collections import deque
|
|
16
16
|
from collections.abc import Callable
|
|
17
|
-
from time import time
|
|
17
|
+
from time import perf_counter, time
|
|
18
18
|
from typing import (
|
|
19
19
|
TYPE_CHECKING,
|
|
20
20
|
Protocol,
|
|
@@ -316,7 +316,7 @@ class TaskSet(metaclass=TaskSetMeta):
|
|
|
316
316
|
self.max_wait = self.user.max_wait
|
|
317
317
|
if not self.wait_function:
|
|
318
318
|
self.wait_function = self.user.wait_function
|
|
319
|
-
self._cp_last_run: float =
|
|
319
|
+
self._cp_last_run: float = perf_counter() # used by constant_pacing wait_time
|
|
320
320
|
self._cp_last_wait_time: float = 0 # used by constant_pacing wait_time
|
|
321
321
|
|
|
322
322
|
@property
|
|
@@ -141,7 +141,7 @@ class User(metaclass=UserMeta):
|
|
|
141
141
|
self._greenlet: greenlet.Greenlet | None = None
|
|
142
142
|
self._group: Group
|
|
143
143
|
self._taskset_instance: TaskSet | None = None
|
|
144
|
-
self._cp_last_run: float = time.
|
|
144
|
+
self._cp_last_run: float = time.perf_counter() # used by constant_pacing wait_time
|
|
145
145
|
self._cp_last_wait_time: float = 0 # used by constant_pacing wait_time
|
|
146
146
|
|
|
147
147
|
def on_start(self) -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import random
|
|
2
2
|
from collections.abc import Callable
|
|
3
|
-
from time import
|
|
3
|
+
from time import perf_counter
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
6
|
if TYPE_CHECKING:
|
|
@@ -52,9 +52,9 @@ def constant_pacing(wait_time: float) -> Callable[["User"], float]:
|
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
54
|
def wait_time_func(self: "User") -> float:
|
|
55
|
-
run_time: float =
|
|
55
|
+
run_time: float = perf_counter() - self._cp_last_run - self._cp_last_wait_time
|
|
56
56
|
self._cp_last_wait_time = max(0, wait_time - run_time)
|
|
57
|
-
self._cp_last_run =
|
|
57
|
+
self._cp_last_run = perf_counter()
|
|
58
58
|
return self._cp_last_wait_time
|
|
59
59
|
|
|
60
60
|
return wait_time_func
|
|
@@ -83,6 +83,8 @@ def constant_throughput(task_runs_per_second: float) -> Callable[["User"], float
|
|
|
83
83
|
If a task execution exceeds the specified wait_time, the wait will be 0 before starting
|
|
84
84
|
the next task.
|
|
85
85
|
"""
|
|
86
|
+
if task_runs_per_second <= 0:
|
|
87
|
+
raise ValueError(f"constant_throughput() requires a positive rate, got: {task_runs_per_second}")
|
|
86
88
|
return constant_pacing(1 / task_runs_per_second)
|
|
87
89
|
|
|
88
90
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|