Pergunta

Um confiável coder amigo me disse que o Python atual do multi-threading implementação é sério buggy - o suficiente para evitar o uso por completo.O que pode dizer sobre este rumor?

Foi útil?

Solução

Python threads são bons para simultâneas de e/S de programação.Threads são trocadas fora da CPU, assim como eles bloco de espera para entrada de arquivo, rede, etc.Isso permite que outras threads em Python para usar a CPU enquanto outros esperam.Isso permitirá que você para escrever um multi-threaded servidor web ou rastreador da web, por exemplo.

No entanto, Python threads são serializados pelo GIL quando eles entram intérprete do núcleo.Isso significa que, se dois segmentos são manipulando números, apenas um pode executar, a qualquer momento.Isso também significa que você não pode ter a vantagem de ser multi-core ou multi-arquiteturas de processador.

Há soluções, como a execução de várias Python intérpretes simultaneamente, usando um C com base threading biblioteca.Isto não é para os fracos de coração e os benefícios podem não valer a pena.Vamos esperar por um Python solução em uma versão futura.

Outras dicas

A implementação padrão do Python (geralmente conhecida como CPython como ele é escrito em C) utiliza OS segmentos, mas já que não é o Global Intérprete De Bloqueio, apenas uma thread por vez é permitida a execução de código Python.Mas, dentro desses limites, a enfiar as bibliotecas são robusta e amplamente utilizada.

Se você quer ser capaz de usar vários núcleos de CPU, existem algumas opções.Uma é usar vários python intérpretes simultaneamente, como mencionado por outros.Outra opção é usar uma implementação diferente do Python para que não use uma GIL.As duas principais opções são Standards e IronPython.

Standards é escrito em Java, e agora está bastante maduro, apesar de algumas incompatibilidades permanecem.Por exemplo, o framework web Django não é executado perfeitamente, mas está chegando o tempo todo.Standards for excelente para a segurança do thread, vem melhor em benchmarks e tem um atrevido mensagem para aqueles que querem o GIL.

IronPython usa .NET framework e é escrito em C#.A compatibilidade é atingir a fase onde Django pode executar no IronPython (pelo menos como uma demonstração) e há guias para uso de threads em IronPython.

O GIL (Global Intérprete de Bloqueio) pode ser um problema, mas a API é bastante OK.Experimente a excelente processing módulo que implementa a API de Threading para processos separados.Eu estou usando agora (apesar de no OS X, ainda tenho que fazer alguns testes no Windows) e estou realmente impressionado.A Fila de classe é realmente salvar minha bacon em termos de gestão da complexidade!

EDITAR:ele acho o módulo de processamento está sendo incluído na biblioteca padrão, a partir da versão 2.6 (import multiprocessing).Alegria!

Até onde eu sei, não há bugs, mas o desempenho quando enfiar no cPython é muito ruim (em comparação a outros threading implementações, mas normalmente bastante bom se todos a maioria dos segmentos fazer é bloquear) devido à GIL (Global Intérprete de Bloqueio), então, realmente é uma implementação específica, ao invés de um idioma específico.Standards, por exemplo, não sofrem este efeito devido ao uso do Java de modelo de thread.

Ver este post sobre o porquê ele não é realmente viável para remover o GIL a partir da implementação cPython, e este para algumas práticas de elaboração e soluções.

Fazer uma rápida no google para "Python GIL" para obter mais informações.

Se você quiser o código em python e obter grande threading suporte, você pode querer verificar para fora o IronPython ou Standards.Desde o código python IronPython e Standards de execução no .NET CLR e Java VM, respectivamente, que apreciar a grande threading suporte incorporado para as bibliotecas.Além de que, IronPython não tem o GIL, um problema que impede que o CPython segmentos de tirar pleno partido do multi-core arquiteturas.

Eu usei-o em vários aplicativos e nunca tinha nem ouvido falar de enfiar sendo qualquer outra coisa do que 100% de confiança, contanto que você saiba seus limites.Você não pode spawn 1000 threads ao mesmo tempo e espera que o programa seja executado corretamente no Windows, no entanto, você pode facilmente escrever um pool de trabalho e apenas alimentá-lo de 1000 operações, e manter tudo bonito e sob controle.

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