Skip to content

Commit

Permalink
Add a restart mechanism to all workers in the multiplexer (#2622)
Browse files Browse the repository at this point in the history
  • Loading branch information
ahopkins committed Dec 11, 2022
1 parent 8e72036 commit 92e7463
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
9 changes: 7 additions & 2 deletions sanic/worker/multiplexer.py
Expand Up @@ -21,9 +21,14 @@ def ack(self):
"state": ProcessState.ACKED.name,
}

def restart(self, name: str = ""):
def restart(self, name: str = "", all_workers: bool = False):
if name and all_workers:
raise ValueError(
"Ambiguous restart with both a named process and"
" all_workers=True"
)
if not name:
name = self.name
name = "__ALL_PROCESSES__:" if all_workers else self.name
self._monitor_publisher.send(name)

reload = restart # no cov
Expand Down
25 changes: 24 additions & 1 deletion tests/worker/test_multiplexer.py
@@ -1,6 +1,6 @@
from multiprocessing import Event
from os import environ, getpid
from typing import Any, Dict
from typing import Any, Dict, Type, Union
from unittest.mock import Mock

import pytest
Expand Down Expand Up @@ -117,3 +117,26 @@ def test_properties(
assert m.workers == worker_state
assert m.state == worker_state["Test"]
assert isinstance(m.state, WorkerState)


@pytest.mark.parametrize(
"params,expected",
(
({}, "Test"),
({"name": "foo"}, "foo"),
({"all_workers": True}, "__ALL_PROCESSES__:"),
({"name": "foo", "all_workers": True}, ValueError),
),
)
def test_restart_params(
monitor_publisher: Mock,
m: WorkerMultiplexer,
params: Dict[str, Any],
expected: Union[str, Type[Exception]],
):
if isinstance(expected, str):
m.restart(**params)
monitor_publisher.send.assert_called_once_with(expected)
else:
with pytest.raises(expected):
m.restart(**params)

0 comments on commit 92e7463

Please sign in to comment.