Как cherrypy обрабатывает пользовательские темы? - PullRequest
4 голосов
/ 26 сентября 2008

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

Ответы [ 2 ]

6 голосов
/ 30 сентября 2008

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

Однако, если вы говорите конкретно о cherrypy.thread_data, это нечто другое: threading.local. Если вы используете последнюю версию Python, то все, что написано на C, и вы (вероятно, по праву) не имеете к ней многопоточного доступа из Python. Если вы действительно нуждаетесь в этом и действительно знаете, что делаете, лучше всего обычно добавить дополнительную ссылку на такие вещи в глобальный контейнер в то же время, когда они вставлен в структуру thread_data. В качестве ключей для этих глобальных контейнеров я рекомендую использовать dicrefs - достаточно Python ORM, которые используют их для пулов соединений (см., Например, мой собственный Geniusql), чтобы вы могли достаточно легко научиться их реализовывать.

4 голосов
/ 30 сентября 2008

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

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

...