Depois de ler http://clojure.org/rationale e outras comparações de desempenho entre o Clojure e muitas linguagens, comecei a pensar que, além da facilidade de uso, não deveria mais codificar no Python, mas no Clojure. Na verdade, comecei a me sentir irresponsável por não aprender Clojure, vendo seus benefícios.
Isso faz sentido? Não posso fazer um uso realmente eficiente de todos os núcleos usando uma linguagem mais imperativa como Python do que um dialeto Lisp ou outra linguagem funcional? Parece que todos os benefícios advêm do uso de dados imutáveis. Não posso fazer exatamente isso em Python e ter todos os benefícios?
Uma vez comecei a aprender um pouco de Common Lisp, li e fiz quase todos os exercícios de um livro emprestado da minha biblioteca da universidade (achei muito bom, apesar da baixa popularidade na Amazon). Mas, depois de um tempo, me vi lutando demais para fazer algumas coisas simples. Eu acho que há coisas que são mais imperativas em sua natureza, que dificultam modelar essas coisas de maneira funcional.
Então, o Python é tão poderoso quanto o Clojure para criar aplicativos que tiram vantagem desse novo futuro multinúcleo?
Observe que não acho que o uso de semáforos, mecanismos de bloqueio ou outro mecanismo de concorrência semelhante seja uma boa alternativa à paralelização "automática" de Clojure.
fonte
Respostas:
Você definitivamente pode . Dependendo do tipo do problema (por exemplo, processar partes claramente separáveis de alguma grande tarefa computacional em paralelo), pode até ser bastante fácil. Acho que a maior parte da concorrência no mundo ainda é feita diretamente em linguagens imperativas, embora o paradigma esteja mudando para soluções funcionais.
O Python não é exatamente conhecido por seus recursos de simultaneidade. Um exemplo de uma linguagem imperativa bem estabelecida com excelente suporte a simultaneidade é o Java.
O truque com dados imutáveis é que, se você fizer isso com estruturas de dados simples e tradicionais, como matrizes, você terá uma cópia maciça e coleta de lixo, prejudicando o desempenho. Em vez disso, você deseja dados efetivamente imutáveis , que podem ser implementados com várias estruturas de dados persistentes , como é feito no Clojure. Tais estruturas poderiam ser feitas em praticamente qualquer linguagem como bibliotecas, mas é claro que o suporte direto à linguagem é sempre melhor.
fonte
O Python é extremamente ruim para aplicativos que precisam de vários threads, mas é causado por deficiência nas máquinas virtuais disponíveis, não na própria linguagem. Os geradores do Python seriam realmente bons candidatos à paralelização implícita. O problema é que a implementação padrão, CPython, pode executar apenas o código python em uma CPU, apenas chamadas em bibliotecas nativas podem ser executadas em paralelo. O tempo de execução do PyPy planeja corrigi-lo, mas ainda não existe e, embora as implementações Jython e IronPython não tenham a limitação, elas são bastante incompletas (elas não possuem grande parte da biblioteca padrão, você deve usar a biblioteca padrão do ambiente de hospedagem neles).
No entanto, existem muitas outras linguagens projetadas e implementadas com paralelismo. É claro que o paralelismo é muito mais fácil em linguagens funcionais, e é por isso que todas as linguagens com bom suporte a paralelismo são funcionais ou têm forte suporte para programação funcional. Eu posso imaginar:
fonte
Os caras aqui deram respostas realmente excelentes.
A programação simultânea geralmente é difícil por causa do "estado de compartilhamento". A programação funcional pode não ser a resposta definitiva, mas certamente a torna possível sem perder o cabelo.
O Clojure com certeza é uma opção viável, mas mesmo com suas excelentes ferramentas de concorrência, você pode precisar criar outra coisa. Verifique Prismatic para um exemplo:
Se você realmente quer enlouquecer, verifique também a Julia Programming Language .
fonte
Além do que Jan Hudec escreveu, eu gostaria de mencionar o Scala , que, além de um estilo de programação funcional, também suporta um estilo de programação imperativo / orientado a objetos.
Scala oferece paralelismo através de atores (também usado por Erlang).
Os atores são uma maneira orientada a objetos de abstrair dos processos / encadeamentos subjacentes: você basicamente vê apenas objetos sendo executados simultaneamente e enviando mensagens um para o outro. Portanto, se você deseja uma maneira orientada a objetos de implementar o paralelismo, também daria uma olhada nas linguagens (ou estruturas) que suportam o modelo de ator.
Você pode encontrar alguns links na wikipedia , para Python existe, por exemplo, Pykka .
fonte