kopia lustrzana https://github.com/cirospaciari/socketify.py
expose block option and also close function on WSGI and ASGI, also avoids exceptions on __del__
rodzic
375b5e0d14
commit
34f3d04036
|
@ -773,10 +773,13 @@ class _ASGI:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self.asgi_http_info:
|
try:
|
||||||
lib.socketify_destroy_asgi_app_info(self.asgi_http_info)
|
if self.asgi_http_info:
|
||||||
if self.asgi_ws_info:
|
lib.socketify_destroy_asgi_app_info(self.asgi_http_info)
|
||||||
lib.socketify_destroy_asgi_ws_app_info(self.asgi_ws_info)
|
if self.asgi_ws_info:
|
||||||
|
lib.socketify_destroy_asgi_ws_app_info(self.asgi_ws_info)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# "Public" ASGI interface to allow easy forks/workers
|
# "Public" ASGI interface to allow easy forks/workers
|
||||||
|
@ -797,12 +800,26 @@ class ASGI:
|
||||||
self.listen_options = None
|
self.listen_options = None
|
||||||
self.task_factory_max_items = task_factory_max_items
|
self.task_factory_max_items = task_factory_max_items
|
||||||
self.lifespan = lifespan
|
self.lifespan = lifespan
|
||||||
|
self.server = None
|
||||||
|
self.pid_list = None
|
||||||
|
|
||||||
def listen(self, port_or_options, handler=None):
|
def listen(self, port_or_options, handler=None):
|
||||||
self.listen_options = (port_or_options, handler)
|
self.listen_options = (port_or_options, handler)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def run(self, workers=1):
|
def close(self):
|
||||||
|
# always wait a sec so forks can start properly if close is called too fast
|
||||||
|
import time
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if self.server is not None:
|
||||||
|
self.server.close()
|
||||||
|
if self.pid_list is not None:
|
||||||
|
import signal
|
||||||
|
for pid in self.pid_list:
|
||||||
|
os.kill(pid, signal.SIGINT)
|
||||||
|
|
||||||
|
def run(self, workers=1, block=True):
|
||||||
def run_task():
|
def run_task():
|
||||||
server = _ASGI(
|
server = _ASGI(
|
||||||
self.app,
|
self.app,
|
||||||
|
@ -815,22 +832,27 @@ class ASGI:
|
||||||
if self.listen_options:
|
if self.listen_options:
|
||||||
(port_or_options, handler) = self.listen_options
|
(port_or_options, handler) = self.listen_options
|
||||||
server.listen(port_or_options, handler)
|
server.listen(port_or_options, handler)
|
||||||
server.run()
|
self.server = server
|
||||||
|
server.run()
|
||||||
|
|
||||||
pid_list = []
|
pid_list = []
|
||||||
|
start = 1 if block else 0
|
||||||
# fork limiting the cpu count - 1
|
# fork limiting the cpu count - 1
|
||||||
for _ in range(1, workers):
|
for _ in range(block, workers):
|
||||||
pid = os.fork()
|
pid = os.fork()
|
||||||
# n greater than 0 means parent process
|
# n greater than 0 means parent process
|
||||||
if not pid > 0:
|
if not pid > 0:
|
||||||
run_task()
|
run_task()
|
||||||
break
|
break
|
||||||
pid_list.append(pid)
|
pid_list.append(pid)
|
||||||
|
|
||||||
|
self.pid_list = pid_list
|
||||||
|
|
||||||
run_task() # run app on the main process too :)
|
if block:
|
||||||
|
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)
|
||||||
|
|
||||||
# sigint everything to gracefull shutdown
|
|
||||||
import signal
|
|
||||||
for pid in pid_list:
|
|
||||||
os.kill(pid, signal.SIGINT)
|
|
||||||
return self
|
return self
|
||||||
|
|
|
@ -3449,10 +3449,13 @@ class App:
|
||||||
self.loop = None
|
self.loop = None
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self.app: # only destroy if exists
|
try:
|
||||||
self.close()
|
if self.app: # only destroy if exists
|
||||||
lib.uws_app_destroy(self.SSL, self.app)
|
self.close()
|
||||||
if self.loop:
|
lib.uws_app_destroy(self.SSL, self.app)
|
||||||
self.loop.dispose()
|
if self.loop:
|
||||||
self.loop = None
|
self.loop.dispose()
|
||||||
|
self.loop = None
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
|
@ -691,10 +691,13 @@ class _WSGI:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self.asgi_http_info:
|
try:
|
||||||
lib.socketify_destroy_asgi_app_info(self.asgi_http_info)
|
if self.asgi_http_info:
|
||||||
if self.asgi_ws_info:
|
lib.socketify_destroy_asgi_app_info(self.asgi_http_info)
|
||||||
lib.socketify_destroy_asgi_ws_app_info(self.asgi_ws_info)
|
if self.asgi_ws_info:
|
||||||
|
lib.socketify_destroy_asgi_ws_app_info(self.asgi_ws_info)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# "Public" WSGI interface to allow easy forks/workers
|
# "Public" WSGI interface to allow easy forks/workers
|
||||||
|
@ -714,13 +717,27 @@ class WSGI:
|
||||||
self.websocket_options = websocket_options
|
self.websocket_options = websocket_options
|
||||||
self.listen_options = None
|
self.listen_options = None
|
||||||
self.task_factory_max_items = task_factory_max_items
|
self.task_factory_max_items = task_factory_max_items
|
||||||
|
self.server = None
|
||||||
|
self.pid_list = None
|
||||||
# lifespan is not supported in WSGI
|
# lifespan is not supported in WSGI
|
||||||
|
|
||||||
def listen(self, port_or_options, handler=None):
|
def listen(self, port_or_options, handler=None):
|
||||||
self.listen_options = (port_or_options, handler)
|
self.listen_options = (port_or_options, handler)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def run(self, workers=1):
|
def close(self):
|
||||||
|
# always wait a sec so forks can start properly if close is called too fast
|
||||||
|
import time
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if self.server is not None:
|
||||||
|
self.server.close()
|
||||||
|
if self.pid_list is not None:
|
||||||
|
import signal
|
||||||
|
for pid in self.pid_list:
|
||||||
|
os.kill(pid, signal.SIGINT)
|
||||||
|
|
||||||
|
def run(self, workers=1, block=True):
|
||||||
def run_task():
|
def run_task():
|
||||||
server = _WSGI(
|
server = _WSGI(
|
||||||
self.app,
|
self.app,
|
||||||
|
@ -732,11 +749,14 @@ class WSGI:
|
||||||
if self.listen_options:
|
if self.listen_options:
|
||||||
(port_or_options, handler) = self.listen_options
|
(port_or_options, handler) = self.listen_options
|
||||||
server.listen(port_or_options, handler)
|
server.listen(port_or_options, handler)
|
||||||
|
self.server = server
|
||||||
server.run()
|
server.run()
|
||||||
|
|
||||||
pid_list = []
|
pid_list = []
|
||||||
|
|
||||||
|
start = 1 if block else 0
|
||||||
# fork limiting the cpu count - 1
|
# fork limiting the cpu count - 1
|
||||||
for _ in range(1, workers):
|
for _ in range(start, workers):
|
||||||
pid = os.fork()
|
pid = os.fork()
|
||||||
# n greater than 0 means parent process
|
# n greater than 0 means parent process
|
||||||
if not pid > 0:
|
if not pid > 0:
|
||||||
|
@ -744,10 +764,13 @@ class WSGI:
|
||||||
break
|
break
|
||||||
pid_list.append(pid)
|
pid_list.append(pid)
|
||||||
|
|
||||||
run_task() # run app on the main process too :)
|
self.pid_list = pid_list
|
||||||
|
|
||||||
|
if block:
|
||||||
|
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)
|
||||||
|
|
||||||
# sigint everything to gracefull shutdown
|
|
||||||
import signal
|
|
||||||
for pid in pid_list:
|
|
||||||
os.kill(pid, signal.SIGINT)
|
|
||||||
return self
|
return self
|
||||||
|
|
Ładowanie…
Reference in New Issue