Como fazer sites Ruby ou Python para usar múltiplos núcleos?

votos
7

Mesmo que Python e Rubi tem uma thread do kernel por thread intérprete, eles têm um bloqueio intérprete global (GIL), que é usado para proteger estruturas de dados potencialmente compartilhados, de modo que este inibe a execução multi-processador. Mesmo que as partes nesses languajes que são escritos em C ou C ++ pode ser free-threaded, isso não é possível com código interpretado pura menos que você use vários processos. Qual é a melhor maneira de conseguir isso? Usando FastCGI ? A criação de um cluster ou uma fazenda de servidores virtualizados? Usando seus equivalentes Java, JRuby e Jython?

Publicado 31/08/2008 em 22:41
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

A maneira 'padrão' para fazer isso com trilhos é executar um "pacote" de instâncias Mongrel (ou seja: 4 cópias do pedido trilhos) e, em seguida, usar ou nginx apache ou algum outro pedaço de software para se sentar na frente deles e agir como um equilibrador de carga.

Esta é, provavelmente, como é feito com outras estruturas de rubi como merb etc, mas eu não usei aqueles pessoalmente.

O sistema operacional irá cuidar da execução de cada vira-lata, por si própria CPU.

Se você instalar mod_rails aka passageiros phusion ele vai começar e parar várias cópias do processo de trilhos para você também, então ele vai acabar se espalhando a carga através de múltiplas CPUs / núcleos de forma semelhante.

Respondeu 31/08/2008 em 23:41
fonte usuário

votos
4

Eu não estou totalmente certo que problema que você quer assim resolver, mas se você implantar seu aplicativo python / Django através de um prefork Apache MPM usando mod_python apache irá iniciar vários processos de trabalho para lidar com diferentes solicitações.

Se um pedido tem tantos recursos, que você deseja usar múltiplos núcleos ter um olhar para pyprocessing . Mas eu não acho que seria sábio.

Respondeu 31/08/2008 em 22:53
fonte usuário

votos
1

Em Python e Ruby só é possível usar múltiplos núcleos, é para desovar processos novos (pesados). Os homólogos Java herdam as possibilidades da plataforma Java. Você poderia implicar uso encadeamentos Java. Isto é, por exemplo, uma razão pela qual, por vezes (muitas vezes) Java Application Server como Glassfish são usados ​​para aplicações Ruby on Rails.

Respondeu 10/10/2008 em 08:18
fonte usuário

votos
1

Utilizar uma interface que é executado cada resposta em um intérprete separado, tal como mod_wsgipara o Python. Isso permite multi-threading ser usado sem encontrar o GIL.

EDIT: Aparentemente, mod_wsgijá não suporta vários intérpretes por processo porque idiotas não conseguia descobrir como implementar adequadamente os módulos de extensão. Ele ainda suporta a execução de pedidos em processos separados FastCGI de estilo, porém, de modo que é, aparentemente, a solução aceite atual.

Respondeu 31/08/2008 em 22:43
fonte usuário

votos
0

Para Python, o PyProcessing projeto permite programar com processos muito parecido com você usaria threads. Ele está incluído na biblioteca padrão do recém-lançado versão 2.6 como multiprocessing. O módulo tem muitos recursos para estabelecer e controlar o acesso a estruturas compartilhadas de dados (filas, tubos, etc.) e suporte para idiomas comuns (isto é, gestores e piscinas de trabalho).

Respondeu 10/10/2008 em 14:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more