API to define a number of workers (#2701)

This commit is contained in:
Adam Hopkins 2023-03-15 16:02:17 +02:00 committed by GitHub
parent 88c918e72f
commit d62a92fac9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 4 deletions

View File

@ -5,7 +5,7 @@ from itertools import count
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
@ -54,9 +54,36 @@ class WorkerManager:
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

View File

@ -192,14 +192,17 @@ class Worker:
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(