Pergunta

A CPU arquitetura da paisagem mudou, vários núcleos é uma tendência que vai mudar a forma como temos de desenvolver software. Eu fiz o desenvolvimento multi-threaded em C, C ++ e Java, eu fiz o desenvolvimento multi-processo utilizando vários mecanismos de IPC. As abordagens tradicionais de usar tópicos não parecem torná-lo fácil, para o desenvolvedor, para utilizar hardware que suporta um alto grau de concorrência.

O que línguas, bibliotecas e técnicas de desenvolvimento você está ciente de que ajuda a aliviar os desafios tradicionais de criação de aplicativos simultâneos? Estou, obviamente, pensando em questões como impasses e as condições de corrida. técnicas de design, bibliotecas, ferramentas, etc. também são interessantes que ajuda realmente aproveitar e garantir que os recursos disponíveis estão sendo utilizados -. apenas escrever, um aplicativo de rosca robusta seguro não garante que ele está usando todos os núcleos disponíveis

O que eu tenho visto até agora é:

  • Erlang : baseado processo, a passagem de mensagens IPC, o modelo 'do ator de concorrência
  • Dramatis : biblioteca atores modelo para Ruby e Python
  • Scala : linguagem de programação funcional para a JVM com algum apoio de simultaneidade adicionado
  • Clojure : linguagem de programação funcional para a JVM com uma biblioteca atores
  • térmita : uma porta de abordagem de processo e mensagem de passagem de Erlang ao Esquema

O que mais você sabe sobre, o que funcionou para você eo que você acha que é interessante para assistir?

Foi útil?

Solução

Eu sugiro duas mudanças de paradigma:

Software Transactional memória

Você pode querer dar uma olhada no conceito de Software Transactional memória (STM). A idéia é usar simultaneidade otimista : qualquer operação que decorre em paralelo com outros tentam completar o seu trabalho em uma transação isolada; se em algum momento outra transação foi confirmada que invalida dados em que essa transação está trabalhando, o trabalho da transação é jogado fora ea transação executado novamente.

Eu acho que a primeira implementação amplamente conhecido da idéia (se não a prova-de-conceito e primeiro) é aquele em Haskell: Papers e apresentações sobre a memória transacional em Haskell . Muitas outras implementações estão listados no da Wikipédia artigo STM .

laço de eventos e promessas

Outra maneira muito diferente de lidar com a concorrência é implementada no [linguagem de programação E] ( http://en.wikipedia.org/wiki/E_ (programming_language% 29) .

Note que a sua maneira de lidar com a concorrência, bem como outras partes do projeto de linguagem, é fortemente baseado no modelo de Ator.

Outras dicas

Você mencionou Java, mas apenas que você menciona threads. Você já olhou para biblioteca concorrente do Java? Ele vem com Java 5 e acima.

É uma biblioteca muito agradável contendo ThreadPools, CopyOnWriteCollections para citar poucos. Confira a documentação na Java Tutorial . Ou se preferir, o Java docs .

Eu usei de processamento para Python. Ele imita a API do rosqueamento módulo e é, portanto, muito fácil de usar.

Se acontecer de uso map/imap ou um gerador / compreensão da lista, convertendo seu código para uso processing é simples:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

pode ser paralelizado com

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

que irá usar no entanto muitos processadores você tem que calcular os resultados. Há também preguiçoso (Pool.imap) são e variantes assíncronos (Pool.map_async).

Há uma classe de fila que implementa Queue.Queue e trabalhadores que são semelhantes para threads.

Gotchas

processing é baseado em fork(), que tem de ser emulado no Windows. Os objetos são transferidos via pickle / unpickle, então você tem que ter certeza de que isso funciona. Bifurcação de um processo que adquiriu recursos já pode não ser o que você quer (acho que as conexões de banco de dados), mas em geral ele funciona. Ele funciona tão bem que foi adicionado ao Python 2.6 na via rápida (cf. PEP -317 ).

Intel Threading Building Blocks para olhares C ++ muito interessantes para mim. Ele oferece um nível muito mais alto de abstração do que linhas cruas. O'Reilly tem um muito bom livro se você gosta de documentação árvore morta. Veja, também, Quaisquer experiências com Threading Building Blocks da Intel? .

Eu diria:

Models: tópicos + estado compartilhado, atores + mensagem de passagem, memória transacional, map / reduce? Idiomas: Erlang, Io, Scala, Clojure, Reia Bibliotecas: Retlang, Jetlang, Kilim, cilk ++, fork / join, MPI, Kamaelia, Terracotta

I manter uma ligação concorrência blog sobre coisas como esta (Erlang, Scala, rosqueamento Java, modelo ator, etc) e colocar um par ligações por dia:

http://concurrency.tumblr.com

Eu venho fazendo programação concorrente em Ada por quase 20 anos agora.

A linguagem em si (não algum pregado em biblioteca) suporta rosqueamento ( "missões"), vários modelos de agendamento, e vários paradigmas de sincronização. Você pode até mesmo construir seus próprios esquemas de sincronização usando o construído em primitivos.

Você pode pensar de Ada encontro como uma espécie de processual orientada sincronização facilidade, enquanto protegida objetos são mais orientada para o objecto. Rendezvous é semelhante ao antigo CS-conceito de monitores , mas muito mais poderoso. objetos protegidos são tipos especiais com primitivas de sincronização que permitem que você construir coisas exatamente como fechaduras OS, semáforos, eventos, etc. No entanto, é bastante poderosa que você também pode inventar e criar seus próprios tipos de objetos de sincronização, dependendo de suas necessidades exatas .

A questão que paralelo modelo de programação que você recomendaria hoje para tirar proveito dos processadores manycore de amanhã? já foi feita. I deu a seguinte resposta lá também.

Kamaelia é um python para construir aplicações com lotes de comunicação processos.

Kamaelia - Concorrência feita útil, divertido

Em Kamaelia você construir sistemas de componentes simples que falam entre si . Este desenvolvimento velocidades, maciçamente auxilia manutenção e também significa que você construção naturalmente software concorrente . É destinado a ser acessível por qualquer desenvolvedor, incluindo novatos. Ele também faz com que seja divertido :)

Que tipo de sistemas? servidores de rede, clientes, aplicativos de desktop, jogos baseados pygame, sistemas de transcodificar e condutas, sistemas de TV digital, erradicadores de spam, ferramentas de ensino, e uma boa quantidade mais :)

Aqui está um vídeo de PyCon 2009. Ela começa comparando Kamaelia a torcida e Python Paralela e, em seguida, dá as mãos na demonstração de Kamaelia.

Fácil simultaneidade com Kamaelia - Parte 1 (59:08)
Fácil simultaneidade com Kamaelia - Parte 2 (18:15)

Eu estou mantendo um olhar atento sobre extensões paralelas para .NET e Parallel LINQ.

Não conheço Reia - uma linguagem que é baseado em Erlang, mas parece mais como Python / ruby.

OpenMP .

Ele lida com tópicos para você, assim você só se preocupar com quais partes do seu C ++ aplicativo que você deseja executar em paralelo.

por exemplo.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

O código acima irá executar o loop for em tantos tópicos como você disse o tempo de execução OpenMP para uso, por isso, se o tamanho é 100, e você tem uma caixa de quad-core, que loop for será executado 25 itens em cada núcleo.

Existem algumas outras extensões paralelas para várias línguas, mas os que eu estou mais interessado em são aqueles que são executados em sua placa gráfica. Isso é o processamento paralelo verdadeiro :) (exemplos: GPU ++ e libSh )

C ++ 0x irá fornecer funções std::lock para bloquear mais do que uma extensão mútua em conjunto. Isso irá ajudar a aliviar impasse devido ao bloqueio fora-de-ordem. Além disso, a biblioteca thread C ++ 0x terá promessas, futuros e tarefas embalados, que permitem que um thread para esperar o resultado de uma operação realizada em outro segmento, sem quaisquer bloqueios no nível de usuário.

multiprocessing é uma biblioteca python que simplifica a programação multi-core, como mencionada em outra resposta.

Programa escrito com multiprocessing de python pode ser facilmente modificado para trabalho navio na nuvem, em vez de núcleos locais. piCloud leva vantagem disso para fornecer grande, poder de processamento sob demanda na nuvem: você só precisa modificar 2 linhas de código.

Então, aqui é o take-away: ao selecionar uma biblioteca para multi-core, um pode querer perguntar se uma abordagem em nuvem também faria sentido.

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