gevent 为什么能让 Flask 同时处理上百个等待中的请求?request 与 g 会不会在 greenlet 之间串?纯计算的请求会怎样?threading.local 要不要 patch?这篇用真实的 gunicorn gevent worker 把这些量出来。
100 个并发请求总耗时 1.05 秒 | 进程数 1 | threading.get_ident() 有 100 个不同的值(每个请求一个 greenlet)| g 读回别人的值的有 0 个
上一篇:WSGI 到 ASGI 的适配;下一篇:Thread Local 与请求隔离。
gthread 1×8 线程 100 个请求总耗时 13.13 秒 sync 1 个 worker(只测 8 个) 8 个请求总耗时 8.05 秒
一个约 0.8 秒的纯计算请求进行中,一个 /fast 请求用了 369 ms(gevent 下没有抢占,要等计算让出) gthread 同样的场景:/fast 用了 40 ms(线程由 GIL 轮流调度,有切换)
未 patch: {'A': 'C', 'B': 'C', 'C': 'C'}
patch_all 之后(新建的 threading.local): {'A': 'A', 'B': 'B', 'C': 'C'}
contextvars(不需要 patch): {'A': 'A', 'B': 'B', 'C': 'C'}