como python stackless pode ser rápido para concorrência?
-
13-09-2019 - |
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
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 ??em> 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 ...