我用uWSGI运行一个烧瓶服务器。该过程由 systemd 启动。
现在我需要一些以"while(True("运行的子进程,它们必须一直收集一些信息。
我现在开始一个具有多处理的子进程。
这是我的一些代码:
from multiprocessing import Process, Value
def start_flask_server():
daemon_data = Value('d', 0.0)
p = Process(target=worker, args=(daemon_data, 1))
p.daemon=True
p.start()
然后我现在使用 systemd 重新启动/停止 uWSGI,进程块,当然它不受 SIG 的影响。
我的第一个想法是实现一个单句柄:
for i in [x for x in dir(signal) if x.startswith("SIG")]:
try:
signum = getattr(signal,i)
signal.signal(signum, signal_term_handler)
app.logger.debug("Added Handler SIG: %s"%i)
except Exception as e:
app.logger.error(e)
app.logger.error("Skipping %s"%i)
但不幸的是,他们没有开火...
如果服务器要关闭,是否可以启动事件,或者我可以在我的应用程序中启动uWSGI"worker"来完成这项工作吗?
我有两个反建议给你:
-
为工作线程创建单独的 systemd 进程。如果你的工作进程不需要与你的 Web 进程通信,这很有效,他们可以通过其他一些协调进程(例如:数据库、Redis、Celery 代理(来实现。
-
使用uwsgi骡子 https://uwsgi-docs.readthedocs.io/en/latest/Mules.html