Как заменить логику thread_locals на асинхронный код?

В проекте django у меня много кода, который зависит от thread_locals: промежуточные устройства, использующие идентификаторы корреляции, другая логика, зависящая от этих промежуточных устройств, кэшированная информация о запросе и так далее.

недавно я начал смешивать sync код с async, и так как у меня один поток обслуживает async часть, я больше не могу использовать thread_locals. так как я использую много sync_to_async и async_to_sync адаптеров, я не могу использовать context vars, потому что при одном и том же запросе выполняются разные coroutines.

какие у меня есть альтернативы для управления короткоживущей информацией, уникальной для каждого запроса? Я думал хранить все на redis как кэш, но опять же, как показать, что я генерирую/получаю ключ от каждого запроса в нескольких точках через его выполнение?

В Python есть модуль contextvars lib для обеспечения некоторой функциональности thread-locals для асинхронного кода. https://docs.python.org/3/library/contextvars.html -

однако, API для контекстных параметров не такой же - наоборот, каждый контекстный_вар может иметь только одно значение, и должен быть установлен и сброшен вызовом метода вместо оператора =.

Я создал проект до того, как contextvars стал официальным, который пытается предоставить "контекст", который работает более близко к threadlocals - - если вы хотите попробовать его, в настоящее время он должен быть установлен с помощью pip прямо из git - основная проблема заключается в следующем У меня не было реального проекта, нуждающегося в нем, который заставил бы меня пройти лишнюю милю, необходимую для его полировки для публикации на Pypi -

Тем не менее, он безупречно работает со всеми тестовыми сценариями, которые я смог придумать - проект находится на https://github.com/jsbueno/extracontext и может быть установлен по pip с помощью pip install git+https://github.com/jsbueno/extracontext.git@0.2b3

Вернуться на верх