Estou interessado em aprender programação simultânea, focando no nível do aplicativo / usuário (não na programação do sistema). Estou procurando uma linguagem de programação moderna de alto nível que forneça abstrações intuitivas para escrever aplicativos simultâneos. Quero focar em linguagens que aumentam a produtividade e ocultam a complexidade da programação simultânea.
Para dar alguns exemplos, não considero uma boa opção escrever código multithread em C, C ++ ou Java, porque IMHO minha produtividade é reduzida e seu modelo de programação não é intuitivo. Por outro lado, linguagens que aumentam a produtividade e oferecem abstrações mais intuitivas, como Python e o módulo de multiprocessamento, Erlang, Clojure, Scala etc., seriam boas opções.
O que você recomendaria com base em sua experiência e por quê?
EDIT: Obrigado a todos por suas respostas interessantes. É difícil concluir sem realmente tentar, pois existem muitos bons candidatos: Erlang, Clojure, Scala, Groovy e talvez Haskell. Votei a resposta com os argumentos mais convincentes, mas tentarei todos os bons candidatos antes de decidir qual escolher :)
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java
. Por quê?On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.
Novamente porque? Expanda sua pergunta para definir melhor o que você está realmente procurando.begin transaction
end transaction
e tudo o que está dentro deve estar livre de impasse e ter sucesso ou falhar como um todo.Respostas:
Você certamente deve olhar para o Clojure - na minha opinião, é a melhor linguagem moderna para programação multinúcleo e é extremamente produtivo.
Chaves de atributo:
Alguns exemplos de mini código com uma inclinação de simultaneidade:
Em particular, vale a pena assistir a um ou mais desses vídeos:
fonte
Você pode tentar D. Ele oferece três modelos. Eu recomendo o primeiro ou o segundo.
std.concurrency . Se você usar este módulo para todas as suas necessidades de simultaneidade, uma combinação do idioma e da biblioteca padrão imporá o isolamento entre os threads. Os encadeamentos se comunicam principalmente por meio da passagem de mensagens, com suporte limitado à memória compartilhada de uma maneira que favorece a "segurança em primeiro lugar" e desabilita as corridas de dados de baixo nível. Infelizmente, a documentação do std.concurrency precisa ser aprimorada, mas o modelo está documentado em um capítulo gratuito do livro de Andrei Alexandrescu, "The D Programming Language".
std.parallelism . Este módulo foi projetado especificamente para paralelismo multicore em vez de simultaneidade de caso geral. ( Simultaneidade e paralelismo não são a mesma coisa, embora a simultaneidade seja necessária para implementar o paralelismo. ) Como todo o ponto do paralelismo é desempenho, std.parallelism não oferece nenhuma garantia de isolamento, porque dificultaria a escrita de código paralelo eficiente. No entanto, ele abstrai muitos detalhes de baixo nível propensos a erros, de modo que é muito difícil estragar tudo se você estiver paralelizando as cargas de trabalho que você verificou manualmente são independentes entre si.
core.thread é um wrapper de baixo nível sobre APIs de encadeamento específicas do SO. Tanto o std.concurrency quanto o std.parallelism o usam sob o capô, mas eu o recomendaria apenas se você estiver escrevendo sua própria biblioteca de simultaneidade ou encontrar algum caso de canto ridículo que não possa ser bem executado no std.parallelism ou std .concorrência. Ninguém deve usar algo tão baixo para o trabalho do dia-a-dia.
fonte
Erlang é definitivamente uma ótima opção, mas algo um pouco mais prático pode ser o Go , o novo idioma do Google.
Não é tão longe de outros idiomas comuns, por isso é fácil de obter, se você já conhece outros idiomas 'fáceis'. Muitas pessoas o comparam com Python ou mesmo Lua em termos de quão 'confortável' é programar.
fonte
Dê uma olhada na Programação Paralela da Microsoft para .net. É muito intuitivo.
fonte
Erlang e Scala têm simultaneidade baseada em ator , que eu achei muito intuitiva e fácil de aprender.
fonte
Estou aprendendo sobre Haskell agora e a leitura deste artigo me convenceu de que Haskell é uma boa opção para programação simultânea. Por ser puramente funcional (o sistema de tipos sabe se uma função faz alguma entrada, saída ou leitura / modificação do estado global), pode fazer coisas como a Memória Transacional de Software (resumida muito bem no artigo acima), que se comporta de maneira semelhante às transações nos bancos de dados - você obtém várias coisas legais, como atomicidade, com apenas um pouco de açúcar extra. AFAIK, threads Haskell também são muito leves. Além dessas coisas, o fato de o Haskell ser puramente funcional permite que mesmo tarefas simples sejam executadas em paralelo com pouco mais do que uma única palavra-chave (par). fonte
fonte
A linguagem GO do Google tem algumas ferramentas interessantes para simultaneidade - isso seria outra coisa divertida de se experimentar. Veja: http://golang.org/doc/effective_go.html#concurrency e leia um pouco para exemplos.
fonte
Na próxima versão, o C # facilita ainda mais o que o diagrama mostra. Existem duas novas palavras-chave Async e Await.
O Async é usado como um modificador de função e diz "esta operação executa seu trabalho em outro thread.
Await é usada dentro de uma função assíncrona, e é aí que a mágica acontece. Basicamente, Await informa ao compilador para executar a operação seguindo a palavra-chave em um thread separado e aguardar os resultados. Qualquer código após a chamada em espera é executado após a operação.
TAMBÉM, a operação é sincronizada com o thread de chamada (por isso, se você estiver executando uma operação assíncrona em resposta a um clique no botão, não precisará postar manualmente novamente no thread da interface do usuário). Duas pequenas palavras-chave e você obtém muito poder de simultaneidade. Leia mais aqui
fonte
Eu ainda recomendaria C ++. É mais do que capaz das abstrações necessárias para escrever código simultâneo decente. A probabilidade esmagadora é que você simplesmente tem uma biblioteca ruim para fazer o trabalho, pois boas bibliotecas para fazer o trabalho são relativamente novas e, na verdade, o conhecimento para usar bem o C ++ não é exatamente comum. O TBB da Intel existe há apenas alguns anos e o PPL da Microsoft só é vendido desde o ano passado.
Se você usar algo como TBB ou PPL, o código simultâneo não será exatamente trivial para escrever, na medida em que a simultaneidade nunca seja trivial, mas longe de ser árdua. Se você usa pthreads ou threads do Win32 diretamente, não é de admirar que você não goste - você está praticamente escrevendo no assembler com essas funções. Mas com o PPL, você está falando sobre algoritmos funcionais padrão paralelos para você, estruturas de dados genéricas para acesso simultâneo e esse tipo de coisa boa.
fonte
std::thread
(oustd::tr1::thread
). Na verdade, é uma abstração muito boa, IMO.boost::thread
é apenas um invólucro do SO com um pouco de RAII. PPL e TBB são algoritmos simultâneos reais, recipientes, etc.Um plug para Ada é necessário aqui, pois possui todas as abstrações de nível superior para paralelismo e simultaneidade. também conhecido como tarefa . Também como o OP pediu intuitivo (um critério subjetivo!), Acho que uma abordagem diferente para o mundo centralizado em java pode ser apreciada.
fonte
Eu sugeriria Groovy / Java / GPars se você puder basear-se na JVM, pois permite atores, fluxo de dados, processos sequenciais de comunicação (CSP), paralelismo de dados, memória transacional de software (STM), agentes, ... O ponto aqui é que existe existem muitos modelos de simultaneidade e paralelismo de alto nível, cada um com diferentes "pontos positivos". Você não deseja usar um modelo que não esteja em harmonia com a solução para um problema que você está tentando construir. Idiomas e estruturas com apenas um modelo o obrigam a invadir algoritmos.
É claro que eu posso ser visto como tendencioso como colaborador do Groovy e GPars. Por outro lado, trabalho com CSP e Python, cf. Python-CSP.
Um ponto adicional é que a pergunta original é sobre aprendizado, não sobre escrever um sistema de produção. Portanto, a combinação Groovy / Java / GPars é uma boa maneira de aprender, mesmo que o trabalho final de produção seja feito em C ++ usando algo como Just :: Thread Pro ou TBB, em vez de ser baseado em JVM.
(Alguns links de URL perfeitamente razoáveis tiveram que ser removidos devido a algum pânico sobre o envio de spam pelo site host.)
fonte
E o Clojure? Você pode usar o Swing, por exemplo, mas aproveitando o recurso de programação simultânea do Clojure? O Clojure possui uma ótima integração com Java.
Além disso, você considerou a estrutura Java 7 Fork / Join ?
fonte
Você também pode querer consultar o Groovy e a biblioteca GPars . O GPars BTW é um pouco semelhante ao .NET Parallel Extension mencionado em outra resposta, mas a sintaxe flexível do Groovys facilita a leitura em algumas circunstâncias.
fonte
O Scala foi mencionado várias vezes nas perguntas e nas respostas, mas não vi nenhuma referência ao Akka, que é uma implementação de ator que pode ser usada com o Scala e o Java.
fonte
Eu acho que depende do que você está construindo. Aplicativos de desktop ou servidor? Ouvi dizer que (mas não tenho experiência pessoal) o node.js é ótimo para programação simultânea de servidores (tanto em termos de escrita de código quanto de desempenho). Se eu quisesse escrever um novo aplicativo de servidor, provavelmente tentaria isso. Não tenho certeza sobre aplicativos de desktop ... Eu escrevi uma quantidade razoável de coisas em C # e existem algumas ferramentas que escondem bem a complexidade, embora em outros casos você precise lidar com isso de frente.
fonte
Posso ser atingido na cabeça por isso, mas você leu o capítulo 7 da TAOUP ? A seção em que estou pensando especificamente é em threads versus processos. Descobri que o conceito de processamento simultâneo faz a maioria das pessoas pensar em threads, mas nunca vi uma instância em que um thread seja mais fácil e rápido de usar do que gerar um processo filho.
Você está desenvolvendo todos os detalhes de como lidar com simultaneidade com os caras inteligentes que construíram seu sistema operacional. Já existem muitos métodos de comunicação e você não precisa se preocupar com o bloqueio de recursos compartilhados. Basicamente, os threads são um hack de eficiência, que se enquadra na regra de otimização. Não otimize se você não testou por necessidade.
Encontre uma boa biblioteca de subprocessos, como enviado para python . Ou você pode simplesmente escrever vários programas separados em C e escrever outro programa "mestre" para usar garfo e cano para gerar e se comunicar com os subprocessos.
fonte