我用 python 构建了一个 grpc 服务器,并尝试使用 werkzeug Local 和 LocalProxy 处理一些线程本地存储,类似于 flask 所做的。
我面临的问题是,当我从服务器拦截器将一些数据存储在本地,然后尝试从服务端检索它时,本地是空的。真正的问题是,由于某种原因,拦截器在与服务程序不同的 greenlet 中运行,因此从 werkzeug.local 开始,不可能跨请求共享数据。对于应该属于同一请求的数据,存储最终会使用不同的密钥。
使用 python 线程库也会发生同样的情况,看起来拦截器是从主线程或与服务程序不同的线程运行的。有解决方法吗?我本来希望拦截器在同一个线程中运行,从而允许这种事情。
# Define a global somewhere
from werkzeug.local import Local
local = Local()
# from an interceptor save something
local.message = "test msg"
# from the service access it
local.service_var = "test"
print local.message # this throw a AttributeError
# print the content of local
print local.__storage__ # we have 2 entries in the storage, 2 different greenlets, but we are in the same request.