Есть ли способ сохранить локальные контексты для подпотоков?

В настоящее время я создаю библиотеку, которая записывает внутренние вызовы, подобные тем, которые были сделаны в библиотеках boto3 и requests, а затем заполняет глобальный объект «данных» на основе некоторых данных, таких как код состояния ответов и т. д.

Первоначально у меня был объект data как глобальный, но потом я понял, что это плохая идея, потому что, когда приложение запускается параллельно, объект data одновременно модифицируется (что может привести к его повреждению), однако я хочу сохранить этот объект отдельно для каждый вызов моего приложения.

Поэтому я изучил локальные контексты Flask, подобно тому, как это делается для его глобального объекта «запрос». Мне удается реализовать способ с помощью LocalProxy как они это сделали, так что теперь он отлично работает с параллельными запросами к моему приложению - проблема сейчас заключается в том, что всякий раз, когда приложение порождает новый подпоток, оно создает совершенно новый контекст, и поэтому я не могу получить объект data из его родительского потока, например для этого сеанса запроса - в основном мне нужно скопировать и изменить тот же объект data, который является локальным для основного потока для этого конкретного запроса приложения.

Чтобы уточнить, я смог сделать это, когда у меня ранее был data как настоящий «глобальный» объект - несколько подпотоков могли правильно изменять один и тот же объект. Однако, как я уже упоминал, он не обрабатывал случай одновременных запросов к приложению; поэтому мне удается это исправить, но теперь подпотоки больше не могут изменять один и тот же объект data *грустное лицо*

Я рассмотрел некоторые решения, подобные приведенным ниже, но это мне не помогло, потому что подход декоратора работает только для «локальных» функций. Поскольку функции, которые мне нужно декорировать, являются «глобальными» функциями, такими как requests.request, которые будут использовать потоки в различных запросах приложений, я думаю, что мне нужно использовать другой подход, при котором я могу временно копировать один и тот же контекст потока для использования в подпотоках (и мое понимание это не должно перезаписывать или украшать функцию, так как это «глобальная» функция, которая будет использоваться одновременными запросами к приложению). Буду признателен за любую помощь или возможные идеи, как я могу заставить это работать для моего варианта использования. Спасибо.

Flask бросает "работает вне контекста запроса", когда начало подпотока


person rv.kvetch    schedule 16.10.2019    source источник
comment
Рассматривали ли вы возможность использования базы данных?   -  person noslenkwah    schedule 16.10.2019
comment
хм... это хорошее предложение, но я не уверен, как в этом случае мне поможет база данных.   -  person rv.kvetch    schedule 16.10.2019
comment
Я не могу получить какие-либо данные из вызова подпотока в моем основном потоке, я думаю, что в настоящее время это проблема. По сути, я хочу, чтобы data был общим объектом для этого сеанса запроса, чтобы я мог собирать данные и говорить, что все эти внутренние вызовы, которые выполнялись в подпотоках, имели эти отдельные ответы или что-то подобное. В настоящее время каждый подпоток работает в своем собственном контексте, поэтому, насколько я понимаю, они в конечном итоге изменят свой собственный объект data. В настоящее время мне не нужно находить данные для каких-либо подпотоков.   -  person rv.kvetch    schedule 16.10.2019
comment
База данных решает именно эту проблему. Он реализован иначе, чем объект данных, но звучит так, как вам нужно.   -  person noslenkwah    schedule 16.10.2019
comment
извините, я так не думаю .. я просто не понимаю, как база данных может помочь с этим. Мой объект data можно рассматривать как очень простой объект, такой как словарь: {'responses': []} очевидно, что это немного упрощено, но в основном я хочу, чтобы объект data был отдельным для каждого сеанса запроса, но разделялся только между потоками одного сеанса запроса. . Просто чтобы несколько потоков могли добавлять в список ответов, и, в конце концов, я мог обрабатывать эти данные в рамках сеанса запроса.   -  person rv.kvetch    schedule 16.10.2019
comment
Я также открыт для других вариантов или предложений, но в основном мне сначала нужен какой-то способ, чтобы я мог получить ответы, в которые будет писать каждый поток (и, очевидно, мне нужно сгруппировать их по сеансу запроса, к которому они принадлежат). прямо сейчас каждый поток в одном контексте запроса может записывать в свой собственный объект данных, но я в основном не могу сопоставить его с контекстом запроса. Я предполагаю, что мне нужно будет использовать get_ident(), чтобы получить идентификатор основного потока, или, может быть, что-то подобное.   -  person rv.kvetch    schedule 17.10.2019