fab*_*uza 5 python frameworks signals flask uwsgi
我正在使用在 docker 容器中运行的 uWSGI 部署 Flask 应用程序。在有 4 个工作人员的应用程序中,有一些内存字典存储应用程序使用的“缓存值”,以防止每次都需要查询数据库。这些字典是在工作人员初始化时创建的,我正在尝试使用 uWSGI 的信号框架来强制更新所有工作人员中的缓存。
我最初的想法是:
例子:
def update_dicts(sig):
# Update dictionaries here
print('Received signal {}: updating dicts in worker {}'.format(sig, uwsgi.worker_id()))
uwsgi.register_signal(100, "workers", update_dicts)
Run Code Online (Sandbox Code Playgroud)
并在需要时在任何工人中触发信号:
uwsgi.signal(100)
Run Code Online (Sandbox Code Playgroud)
然而,即使信号以“工人”为目标,信号也只能由一名工人接收和处理,就好像它有“工人”作为目标一样。
我还尝试为每个工人注册一个信号(使用目标“workerN”)并触发所有这些信号,但信号被发送给任何工人,而不是指定的工人:
# Each worker executes this
# Signal registrations: 111, 112, 113, 114
uwsgi.register_signal(110 + uwsgi.worker_id(), "worker{}".format(uwsgi.worker_id()), update_service_dicts)
# To trigger the signals:
for i in [1,2,3,4]:
uwsgi.signal(110 + i)
Run Code Online (Sandbox Code Playgroud)
应用程序日志:
[uwsgi-signal] signum 113 registered (wid: 3 modifier1: 0 target: worker3)
[uwsgi-signal] signum 112 registered (wid: 2 modifier1: 0 target: worker2)
[uwsgi-signal] signum 114 registered (wid: 4 modifier1: 0 target: worker4)
[uwsgi-signal] signum 111 registered (wid: 1 modifier1: 0 target: worker1)
Mon Jun 5 18:17:51 2017 - error managing signal 112 on worker 4
Received signal 111: updating dicts in worker 1.
Received signal 113: updating dicts in worker 3.
Received signal 114: updating dicts in worker 4.
Run Code Online (Sandbox Code Playgroud)
再次触发:
Mon Jun 5 18:18:01 2017 - error managing signal 111 on worker 4
Mon Jun 5 18:18:01 2017 - error managing signal 113 on worker 4
Mon Jun 5 18:18:01 2017 - error managing signal 112 on worker 4
Received signal 114: updating dicts in worker 4.
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了什么还是这些目标尚未实施?
我目前使用以下 uwsgi 配置:
[uwsgi]
die-on-term = true
http = 0.0.0.0:9090
mount = /=/path/to/my/app/file.py
callable = app
chdir = /path/to/my/app/
; enable the stats server on port 9191
stats = 0.0.0.0:9191
; log configuration
logto = /var/log/uwsgi/uwsgi.log
; spawn 2 threads in 4 processes (concurrency level: 8)
processes = 4
threads = 2
; drop privileges
uid = pmais
gid = pmais
; Loads apps independently to solve error related to DB connection:
; "SSL error: decryption failed or bad record mac uwsgi"
; Reference: http://stackoverflow.com/a/22753269
lazy-apps = true
catch-exceptions = true
Run Code Online (Sandbox Code Playgroud)