Pergunta

Eu estou procurando um servidor web python que é multithreaded em vez de ser multi-processo (como no caso do mod_python para o Apache). Eu quero que ele seja multithread porque eu quero ter um em cache de objeto de memória que será usada por vários tópicos HTTP. Meu servidor faz um monte de coisas caras e calcula algumas matrizes de grandes dimensões que precisa ser armazenado em cache na memória para uso futuro para recalcular evitar. Isso não é possível em um ambiente de servidor web multi-processo. Armazenar essas informações em cache de memória também não é uma boa idéia de como as matrizes são grandes e armazená-los em memcache levaria a desserialização de dados provenientes de memcache além da sobrecarga adicional de IPC.

Eu implementei um simples servidor web usando BaseHttpServer, dá um bom desempenho, mas fica preso depois de algumas horas. Eu preciso de algum servidor web mais amadurecido. É possível configurar o Apache para usar mod_python sob um modelo de thread para que eu possa fazer algum objeto cache?

Foi útil?

Solução

CherryPy . Recursos, conforme listado no site:

  • Um rápido, HTTP / 1.1-compliant, webserver WSGI thread-pool. Normalmente, a própria CherryPy leva apenas 1-2ms por página!
  • Suporte para qualquer outro servidor ou adaptador habilitado para WSGI, incluindo Apache, IIS, lighttpd, mod_python, FastCGI, SCGI e mod_wsgi
  • Fácil de executar vários servidores HTTP (por exemplo, em vários portos) de uma só vez
  • Um sistema de configuração poderosa para desenvolvedores e implantadores tanto
  • Um sistema de plugins flexível
  • Built-in ferramentas para cache, codificação, sessões de autorização, conteúdo estático, e muitos mais
  • Um adaptador mod_python nativa
  • A suíte de testes completa
  • Swappable e personalizável ... tudo.
  • Built-in de perfis, cobertura e testando apoio.

Outras dicas

Considere reconsiderando seu design. Manter que muito do estado em seu servidor web é provavelmente uma má idéia. Multi-processo é uma maneira muito melhor para ir para a estabilidade.

Existe outra maneira de estado share entre processos separados? Que tal um serviço? Base de dados? Índice?

Parece improvável que a manutenção de uma enorme variedade de dados na memória e depender de um único processo de multi-threaded para servir todos os seus pedidos é o melhor design ou arquitetura para a sua aplicação.

torcida pode servir como tal servidor de web. Embora não seja em si vários segmentos, existe uma (ainda não libertado) de vários segmentos recipiente WSGI presente no tronco corrente. Você pode conferir o repositório SVN e depois executar:

twistd web --wsgi=your.wsgi.application

É difícil dar uma resposta definitiva sem saber que tipo de site que você está trabalhando e que tipo de carga que você está esperando. Sub segunda apresentação pode ser um requisito grave ou não pode. Se você realmente precisa para salvar o último milésimo de segundo, em seguida, é absolutamente necessário para manter suas matrizes na memória. No entanto, como outros têm sugerido que é mais do que provável que você não fizer isso e poderia começar perto com outra coisa. O seu padrão de uso dos dados na matriz podem afetar o que tipos de escolhas que você faz. Você provavelmente não precisa de acesso a todo o conjunto de dados a partir da matriz de uma só vez para que você pudesse quebrar seus dados em pedaços menores e colocar os pedaços no cache em vez de um grande pedaço. Dependendo da forma como as suas necessidades de dados de matriz para ficar atualizado que você pode fazer uma escolha entre memcached, db local (Berkley, sqlite, instalação pequena mysql, etc) ou um db remoto. Eu diria que o memcached para atualizações bastante frequentes. A db local para algo na frequência de hora em hora e remoto para a frequência de diária. Uma coisa a considerar é também o que acontece depois de um erro de cache. Se 50 clientes, de repente obter um erro de cache e todos eles ao mesmo tempo decidir começar a regenerar essas matrizes caros sua caixa (es) será rapidamente reduzido a 8086 do. Então você tem que levar em consideração como você vai lidar com isso. Muitos artigos lá fora, tampa como se recuperar de erros de cache. Espero que este seja útil.

Não multithreaded, mas torcida pode servir as suas necessidades.

Você poderia passar a usar um cache distribuído que é acessível a partir de cada processo, memcached sendo o exemplo que vem à mente.

web.py me fez feliz no passado. Considere verificar-se.

Mas ele faz soar como um redesenho de arquitetura pode ser a adequada embora mais caro, solução,.

Talvez você tenha um problema com a sua implementação em Python utilizando BaseHttpServer. Não há nenhuma razão para que "ficar preso", ea implementação de um simples rosca servidor usando BaseHttpServer e threading não deve ser difícil.

Além disso, veja http://pymotw.com/2/BaseHTTPServer/ index.html # módulo-BaseHTTPServer sobre a implementação de um servidor multi-threaded simples com HTTPServer e ThreadingMixIn

Eu uso CherryPy tanto pessoal como profissionalmente, e eu estou extremamente feliz com ele. Eu mesmo fazer o tipo de coisa que você está descrevendo, como ter caches de objetos globais, executando outros tópicos no fundo, etc. E ele se integra bem com Apache; basta executar CherryPy como um servidor independente obrigado a localhost, em seguida, usar mod_proxy e mod_rewrite do Apache para ter Apache de forma transparente para a frente seus pedidos de CherryPy.

O site CherryPy é http://cherrypy.org/

Na verdade, eu tive o mesmo problema recentemente. A saber:. Escrevemos um servidor simples usando BaseHTTPServer e descobriu que o fato de que não é multi-threaded foi uma grande desvantagem

Minha solução foi a porta que o servidor para Pilões ( http://pylonshq.com/ ). O porto foi bastante fácil e um benefício foi que é muito fácil criar uma GUI usando Pylons assim que eu era capaz de lançar uma página de status em cima do que é basicamente um processo daemon.

Eu resumiria Pilões desta maneira:

  • é semelhante ao Ruby on Rails na medida em que pretende ser muito fácil de implantar aplicações web
  • -lo de linguagem de modelagem padrão, Mako, é muito bom trabalhar com
  • que utiliza um sistema de urls de roteamento que é muito conveniente
  • para nós desempenho não é um problema, então eu não pode garantir que Pilões iria realizar de forma adequada para suas necessidades
  • você pode usá-lo com Apache & LightHTTPD, embora eu não tentei isso

Nós também executar um aplicativo com torcida e está feliz com isso. Torcida tem bom desempenho, mas acho rosca single-/ modelo de programação da torcida defer-to-thread bastante complicado. Ele tem muitas vantagens, mas não seria a minha escolha para um aplicativo simples.

Boa sorte.

Apenas apontar algo diferente dos suspeitos do costume ...

Alguns anos atrás, enquanto eu estava usando Zope 2.x eu li sobre Medusa como era o servidor web usado para a plataforma. Eles anunciado que ele funcione bem sob carga pesada e pode fornecê-lo com a funcionalidade que você perguntou.

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