Вопрос

Я работаю над приложением Django и использую CherryPy в качестве сервера.Cherrypy создает новую тему для каждого просмотра страницы.Я хотел бы иметь доступ ко всем этим потокам (потокам, отвечающим за общение с django) изнутри любого из них.Более конкретно, я хотел бы иметь доступ к thread_data для каждого из этих потоков изнутри любого из них.Это возможно?Если да, то как мне это сделать?

Это было полезно?

Решение

wsgiserver CherryPy не создает новый поток для каждого запроса — он использует пул.Каждый из этих рабочих потоков является подклассом threading.Thread, поэтому все они должны быть доступны через threading.enumerate().

Однако, если вы говорите конкретно о Cherrypy.thread_data, это нечто другое:поток.локальный.Если вы используете последнюю версию Python, то все это закодировано на C, и у вас (вероятно, по праву) нет к ней межпоточного доступа из Python.Если вы Действительно нужно это и Действительно Знайте, что вы делаете, лучший метод обычно состоит в том, чтобы добавить дополнительную ссылку на такие вещи в глобальный контейнер одновременно с их вставкой в ​​структуру thread_data.Я рекомендую dicts со слабыми ссылками в качестве ключей для этих глобальных контейнеров - существует достаточно ORM Python, которые используют их для пулов соединений (см., например, мой собственный Geniusql), поэтому вы сможете довольно легко научиться их реализовывать.

Другие советы

Мой первый ответ на подобный вопрос – не сказать вам, как это сделать, а подчеркнуть, что вам действительно следует пересмотреть свое решение, прежде чем двигаться дальше.Обычно я избегаю многопоточных веб-серверов в пользу многопроцессных или асинхронных решений.Добавление к этому явного взаимодействия между потоками только усиливает эти опасения.

Когда задается такой вопрос, возникает более глубокая цель.Я подозреваю, что то, что, по вашему мнению, может решить межпотоковая связь, на самом деле может быть решено каким-то другим, более безопасным способом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top