Pergunta

Eu estou trabalhando em um direito django app e eu estou usando cherrypy que o servidor. Cherrypy cria uma nova thread para cada exibição de página. Eu gostaria de ser capaz de acessar todos esses tópicos (threads responsáveis ??por falar com django) a partir de qualquer um deles. Mais especificamente eu gostaria de ser capaz de acessar o thread_data para cada um desses tópicos a partir de qualquer um deles. Isso é possível? Se sim, como eu faço isso?

Foi útil?

Solução

wsgiserver do CherryPy não cria um novo segmento para cada pedido - ele usa uma piscina. Cada um desses segmentos de trabalho é uma subclasse de threading.Thread, então todos eles devem ser acessíveis via threading.enumerate ().

No entanto, se você está falando especificamente sobre cherrypy.thread_data, isso é outra coisa: a threading.local. Se você estiver usando uma versão recente do Python, então tudo o que é codificado em C e você (provavelmente com razão) não têm acesso cross-thread-lo de Python. Se você realmente precisa e realmente sabe o que está fazendo, a melhor técnica é geralmente furar uma referência adicional a essas coisas em um recipiente global, ao mesmo tempo que eles são inseridos na estrutura thread_data. Eu recomendo dicts com weakrefs como chaves para aqueles recipientes globais -. Há é suficiente Python ORM que usá-los para pools de conexão (ver meu próprio Geniusql, por exemplo) que você deve ser capaz de aprender como implementá-los facilmente

Outras dicas

A minha primeira resposta a uma pergunta como esta não é para dizer-lhe como fazê-lo, mas ao estresse que você realmente deveria reconsiderar antes de avançar com isto. I normalmente coíbe de web-servidores encadeados, em favor de multi-processo ou soluções assíncronas. Adicionando a comunicação inter-thread explícita à mistura só aumenta esses medos.

Quando uma questão como esta é feita, há um objetivo mais profundo. Eu suspeito que o que você pensa a comunicação inter-thread resolveria pode realmente ser resolvido de alguma outra maneira, mais seguro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top