Я работаю над приложением django и использую Cherpy в качестве сервера. Cherrypy создает новый поток для каждого просмотра страницы. Я хотел бы иметь доступ ко всем этим потокам (потокам, ответственным за общение с django) из любого из них. В частности, я хотел бы иметь доступ к thread_data для каждого из этих потоков из любого из них. Это возможно? Если да, то как мне это сделать?
Как Cherpy обрабатывает пользовательские потоки?
Ответы (2)
CherryPy wsgiserver не создает новый поток для каждого запроса — он использует пул. Каждый из этих рабочих потоков является подклассом threading.Thread, поэтому все они должны быть доступны через threading.enumerate().
Однако, если вы говорите конкретно о cherrypy.thread_data, это что-то другое: threading.local. Если вы используете последнюю версию Python, то все это закодировано на C, и у вас (вероятно, по праву) нет доступа к нему из Python. Если вам это действительно нужно и вы действительно понимаете, что делаете, лучше всего вставлять дополнительную ссылку на такие вещи в глобальный контейнер одновременно с они вставляются в структуру thread_data. Я рекомендую словари со слабыми ссылками в качестве ключей для этих глобальных контейнеров — существует достаточно ORM Python, которые используют их для пулов соединений (см., например, мой собственный Geniusql), поэтому вы сможете довольно легко научиться их реализовывать.
Мой первый ответ на вопрос, подобный этому, состоит не в том, чтобы рассказать вам, как это сделать, а в том, чтобы подчеркнуть, что вам действительно следует пересмотреть свое решение, прежде чем двигаться дальше. Обычно я избегаю многопоточных веб-серверов в пользу многопроцессорных или асинхронных решений. Добавление явного взаимодействия между потоками только увеличивает эти опасения.
Когда задают такой вопрос, есть более глубокая цель. Я подозреваю, что то, что, по вашему мнению, может решить межпотоковое взаимодействие, на самом деле может быть решено каким-то другим, более безопасным способом.