В настоящее время я создаю библиотеку, которая записывает внутренние вызовы, подобные тем, которые были сделаны в библиотеках boto3
и requests
, а затем заполняет глобальный объект «данных» на основе некоторых данных, таких как код состояния ответов и т. д.
Первоначально у меня был объект data
как глобальный, но потом я понял, что это плохая идея, потому что, когда приложение запускается параллельно, объект data
одновременно модифицируется (что может привести к его повреждению), однако я хочу сохранить этот объект отдельно для каждый вызов моего приложения.
Поэтому я изучил локальные контексты Flask, подобно тому, как это делается для его глобального объекта «запрос». Мне удается реализовать способ с помощью LocalProxy как они это сделали, так что теперь он отлично работает с параллельными запросами к моему приложению - проблема сейчас заключается в том, что всякий раз, когда приложение порождает новый подпоток, оно создает совершенно новый контекст, и поэтому я не могу получить объект data
из его родительского потока, например для этого сеанса запроса - в основном мне нужно скопировать и изменить тот же объект data
, который является локальным для основного потока для этого конкретного запроса приложения.
Чтобы уточнить, я смог сделать это, когда у меня ранее был data
как настоящий «глобальный» объект - несколько подпотоков могли правильно изменять один и тот же объект. Однако, как я уже упоминал, он не обрабатывал случай одновременных запросов к приложению; поэтому мне удается это исправить, но теперь подпотоки больше не могут изменять один и тот же объект data
*грустное лицо*
Я рассмотрел некоторые решения, подобные приведенным ниже, но это мне не помогло, потому что подход декоратора работает только для «локальных» функций. Поскольку функции, которые мне нужно декорировать, являются «глобальными» функциями, такими как requests.request
, которые будут использовать потоки в различных запросах приложений, я думаю, что мне нужно использовать другой подход, при котором я могу временно копировать один и тот же контекст потока для использования в подпотоках (и мое понимание это не должно перезаписывать или украшать функцию, так как это «глобальная» функция, которая будет использоваться одновременными запросами к приложению). Буду признателен за любую помощь или возможные идеи, как я могу заставить это работать для моего варианта использования. Спасибо.
Flask бросает "работает вне контекста запроса", когда начало подпотока
data
был общим объектом для этого сеанса запроса, чтобы я мог собирать данные и говорить, что все эти внутренние вызовы, которые выполнялись в подпотоках, имели эти отдельные ответы или что-то подобное. В настоящее время каждый подпоток работает в своем собственном контексте, поэтому, насколько я понимаю, они в конечном итоге изменят свой собственный объектdata
. В настоящее время мне не нужно находить данные для каких-либо подпотоков. - person rv.kvetch   schedule 16.10.2019data
можно рассматривать как очень простой объект, такой как словарь:{'responses': []}
очевидно, что это немного упрощено, но в основном я хочу, чтобы объектdata
был отдельным для каждого сеанса запроса, но разделялся только между потоками одного сеанса запроса. . Просто чтобы несколько потоков могли добавлять в список ответов, и, в конце концов, я мог обрабатывать эти данные в рамках сеанса запроса. - person rv.kvetch   schedule 16.10.2019get_ident()
, чтобы получить идентификатор основного потока, или, может быть, что-то подобное. - person rv.kvetch   schedule 17.10.2019