Pergunta

python stackless não tomar um bom uso de multi-core, então onde está o ponto que deve ser mais rápido do que fio python / multiprocessamento?

todo o benchmark uso stackless python tasklet para comparar com bloqueio de segmento python e fila, isso é injusto, causa bloqueio sempre tem baixa eficiência

Veja, se chamada de função uso único segmento sem bloqueá-lo deve ser tão eficiente quanto stackless python

Foi útil?

Solução

Foco na funcionalidade em primeiro lugar, e em segundo lugar o desempenho (a menos que você sabe que tem a necessidade).

Na maioria das vezes em um servidor é gasto com E / S, de modo multi-núcleos não ajuda muito. Se é principalmente I / O que você está trabalhando com, multi-threading python pode ser a resposta mais simples.

Se os pedidos do servidor são intensivo da CPU, em seguida, ter um processo pai (seja multi-threaded ou não), e respectivos processos filho faz um bom bocado de sentido.

Se você realmente quer escalar, você pode olhar para uma plataforma diferente, como Erlang. Se você realmente deseja dimensionar e ainda usar python, você pode olhar para Erlang distribuído com Python processos gerenciados como portas Erlang em um cluster distribuído.

Muitas opções, mas a menos que você está lidando com someting big big , você poderia provavelmente ter uma abordagem simples.

liberar cedo, libere frequentemente.

Outras dicas

Não existe essa coisa nova e moderna chamada assíncronos-IO-loops e de passagem de mensagens-simultaneidade e alguns outros termos da moda. Bem, não é nada novo, mas é apenas estes últimos 5 anos a ser descobertos pelo mainstream.

Stackless Python é uma versão do Python onde o VM tem em si foi modificado para melhor apoiar estas passagem de mensagens e IO laços, e seu truque é verde rosqueamento / co-rotinas.

Existem outras bibliotecas para fazer o mesmo com diferentes ferramentas, por exemplo, Torcida e Tornado, em Python. Você pode até mesmo executar híbrido trançado em Stackless Python e assim por diante.

O bit circuito IO mapeia diretamente à forma como soquetes Berkley fazer IO assíncrono, e com um pouco de esforço pode ser estendido para ser proactiva e não reactiva e trabalhar com sistemas de arquivos, bem como soquetes de rede, por exemplo, o mais novo libevent.

Para os lados de escala para utilizar mais de um núcleo é onde você tem duas abordagens - multithreading ; estado compartilhado por exemplo fios ou entre processos - multiprocessamento por exemplo filas de mensagens. É uma limitação geral das arquiteturas atuais que os fios abordagem funciona bem para um grande número de núcleos localmente, enquanto que a passagem de mensagens ultrapassagens em termos de performance como o número de núcleos torna-se maciça ou se esses núcleos estiverem em máquinas diferentes. E você pode fazer uma abordagem híbrida.

Por causa de escolhas de design internos do Python VM, geralmente não é tão eficiente em multi-threading como multi-processamento, para que ir a vários processos com passagem de mensagens mais cedo do que você pode em outras plataformas.

Mas geralmente a mensagem abordagem que passa é um produto de limpeza, facilmente correta versão.

E há outras línguas que construir sobre esta mesma abordagem com diferentes objetivos adicionais e restrições por exemplo Erlang, node.js, Clojure, Go.

Destes, Clojure é talvez o mais informativo. Quando você entender como Clojure carrapatos, e acho que através do porquês , todo os objectivos e constrangimentos dos outros sistemas vai cair no lugar ...

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