Flask 部署成多个进程之后,模块里的全局变量还可靠吗?--preload 改变了什么?进程内缓存的命中率会怎样?这篇用 4 个 gunicorn worker 与自己起的 redis,把每种现象量出来。
40 次 /inc 落在各进程的次数: [1, 6, 16, 17] (共 4 个进程)
20 次读取看到的「全局计数」(进程号, 值): [(558, 6), (559, 17)]
同一时刻读到的 local 值有 2 种,期望是 40 的只有 0 种;而 redis 里共享的计数始终是 {40}上一篇:Gunicorn Worker 类型;下一篇:后台线程与 Application Context。
redis 是自己在非默认端口起的临时实例,验证完就关闭了。
不加 --preload 看到 4 个进程,STARTUP_TOKEN 有 4 个不同的值 --preload 看到 4 个进程,STARTUP_TOKEN 有 1 个不同的值
同一个 key 请求 40 次,「现算」了 4 次(每个进程第一次各算一次,期望只算 1 次)
(redis 的 INCR 是原子的,4 个进程各自 INCR,读到的是同一个总数)