Skip to content

Commit

Permalink
API to define a number of workers (#2701)
Browse files Browse the repository at this point in the history
  • Loading branch information
ahopkins authored Mar 15, 2023
1 parent 88c918e commit d62a92f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
33 changes: 30 additions & 3 deletions sanic/worker/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from random import choice
from signal import SIGINT, SIGTERM, Signals
from signal import signal as signal_func
from typing import Dict, List, Optional
from typing import Any, Callable, Dict, List, Optional

from sanic.compat import OS_IS_WINDOWS
from sanic.exceptions import ServerKilled
Expand Down Expand Up @@ -54,9 +54,36 @@ def __init__(
signal_func(SIGINT, self.shutdown_signal)
signal_func(SIGTERM, self.shutdown_signal)

def manage(self, ident, func, kwargs, transient=False) -> Worker:
def manage(
self,
ident: str,
func: Callable[..., Any],
kwargs: Dict[str, Any],
transient: bool = False,
workers: int = 1,
) -> Worker:
"""
Instruct Sanic to manage a custom process.
:param ident: A name for the worker process
:type ident: str
:param func: The function to call in the background process
:type func: Callable[..., Any]
:param kwargs: Arguments to pass to the function
:type kwargs: Dict[str, Any]
:param transient: Whether to mark the process as transient. If True
then the Worker Manager will restart the process along
with any global restart (ex: auto-reload), defaults to False
:type transient: bool, optional
:param workers: The number of worker processes to run, defaults to 1
:type workers: int, optional
:return: The Worker instance
:rtype: Worker
"""
container = self.transient if transient else self.durable
worker = Worker(ident, func, kwargs, self.context, self.worker_state)
worker = Worker(
ident, func, kwargs, self.context, self.worker_state, workers
)
container[worker.ident] = worker
return worker

Expand Down
5 changes: 4 additions & 1 deletion sanic/worker/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,17 @@ def __init__(
server_settings,
context: BaseContext,
worker_state: Dict[str, Any],
num: int = 1,
):
self.ident = ident
self.num = num
self.context = context
self.serve = serve
self.server_settings = server_settings
self.worker_state = worker_state
self.processes: Set[WorkerProcess] = set()
self.create_process()
for _ in range(num):
self.create_process()

def create_process(self) -> WorkerProcess:
process = WorkerProcess(
Expand Down

0 comments on commit d62a92f

Please sign in to comment.