From 23f6e26d264c893ac9c0696064272e3664a36290 Mon Sep 17 00:00:00 2001 From: Ciro Date: Sun, 12 Mar 2023 16:08:54 -0300 Subject: [PATCH] fix forks --- examples/forks.py | 23 +++++++++++++---------- src/socketify/asgi.py | 19 ++++++++++++------- src/socketify/cli.py | 18 ++++++++---------- src/socketify/wsgi.py | 25 +++++++++++++++---------- 4 files changed, 48 insertions(+), 37 deletions(-) diff --git a/examples/forks.py b/examples/forks.py index 4d26d99..d9db962 100644 --- a/examples/forks.py +++ b/examples/forks.py @@ -2,7 +2,6 @@ from socketify import App import os import multiprocessing - def run_app(): app = App() app.get("/", lambda res, req: res.end("Hello, World!")) @@ -16,15 +15,19 @@ def run_app(): app.run() -def create_fork(): - n = os.fork() - # n greater than 0 means parent process - if not n > 0: - run_app() - - +pid_list = [] # fork limiting the cpu count - 1 -for i in range(1, multiprocessing.cpu_count()): - create_fork() +for _ in range(1, multiprocessing.cpu_count()): + pid = os.fork() + # n greater than 0 means parent process + if not pid > 0: + run_app() + break + pid_list.append(pid) run_app() # run app on the main process too :) + +# sigint everything to gracefull shutdown +import signal +for pid in pid_list: + os.kill(pid, signal.SIGINT) \ No newline at end of file diff --git a/src/socketify/asgi.py b/src/socketify/asgi.py index 234bedb..24375f2 100644 --- a/src/socketify/asgi.py +++ b/src/socketify/asgi.py @@ -771,15 +771,20 @@ class ASGI: server.listen(port_or_options, handler) server.run() - def create_fork(): - n = os.fork() - # n greater than 0 means parent process - if not n > 0: - run_task() - + pid_list = [] # fork limiting the cpu count - 1 for _ in range(1, workers): - create_fork() + pid = os.fork() + # n greater than 0 means parent process + if not pid > 0: + run_task() + break + pid_list.append(pid) run_task() # run app on the main process too :) + + # sigint everything to gracefull shutdown + import signal + for pid in pid_list: + os.kill(pid, signal.SIGINT) return self diff --git a/src/socketify/cli.py b/src/socketify/cli.py index 8e49381..5f86242 100644 --- a/src/socketify/cli.py +++ b/src/socketify/cli.py @@ -310,22 +310,20 @@ def execute(args): fork_app.listen(AppListenOptions(port=port, host=host), listen_log) fork_app.run() - # now we can start all over again - def create_fork(_): - n = os.fork() + pid_list = [] + # fork limiting the cpu count - 1 + for _ in range(1, workers): + pid = os.fork() # n greater than 0 means parent process - if not n > 0: + if not pid > 0: run_app() - return n + break + pid_list.append(pid) - # run in all forks - pid_list = list(map(create_fork, range(1, workers))) + run_app() # run app on the main process too :) - # run in this process - run_app() # sigint everything to gracefull shutdown import signal - for pid in pid_list: os.kill(pid, signal.SIGINT) else: diff --git a/src/socketify/wsgi.py b/src/socketify/wsgi.py index 291278a..61eed97 100644 --- a/src/socketify/wsgi.py +++ b/src/socketify/wsgi.py @@ -500,7 +500,7 @@ class WSGI: return self def run(self, workers=1): - def run_app(): + def run_task(): server = _WSGI( self.app, self.options, @@ -513,15 +513,20 @@ class WSGI: server.listen(port_or_options, handler) server.run() - def create_fork(): - n = os.fork() - # n greater than 0 means parent process - if not n > 0: - run_app() - + pid_list = [] # fork limiting the cpu count - 1 - for i in range(1, workers): - create_fork() + for _ in range(1, workers): + pid = os.fork() + # n greater than 0 means parent process + if not pid > 0: + run_task() + break + pid_list.append(pid) - run_app() # run app on the main process too :) + run_task() # run app on the main process too :) + + # sigint everything to gracefull shutdown + import signal + for pid in pid_list: + os.kill(pid, signal.SIGINT) return self