如何在异步代码上替换thread_locals逻辑?



在django项目中,我有很多代码依赖于thread_locals:中间件使用关联id,其他依赖于这些中间件的逻辑,缓存的请求信息等等。

最近我开始将同步代码与异步代码混合,因为我有一个线程服务于异步部分,所以我不能再使用thread_locals了。由于我正在使用大量的sync_to_asyncasync_to_sync适配器,我不能使用上下文变量,因为在相同的请求中执行不同的协程上下文被相应地复制,使上下文变量成为thread_locals的正确替代品

我有什么替代方法来管理每个请求唯一的短期信息?我想将所有内容存储在redis上作为缓存,但是再次,我如何通过执行从几个点上的每个请求生成/检索键?

Python有contextvars库模块来为异步代码提供线程局部化的一些功能。https://docs.python.org/3/library/contextvars.html

然而,上下文变量的API是不一样的——相反,每个上下文变量只能有一个值,必须通过方法调用来设置和重置,而不是=操作符。

在contextvars正式发布之前,我创建了一个项目,试图提供一个"上下文"哪个更接近于threadlocals——如果你想尝试它,它目前必须直接从git安装——主要的问题是我没有实际的项目需要它,所以我花了额外的时间来润色它,以便在Pypi上发布-

尽管如此,它在我能想到的所有测试场景中都能完美地工作-该项目位于https://github.com/jsbueno/extracontext,可以使用pip install git+https://github.com/jsbueno/extracontext.git@0.2b3进行pip安装

最新更新