Pergunta

Como decidir se deve usar threads ou criar processos separados em seu aplicativo para obter paralelismo.

Foi útil?

Solução

Threads são mais leves e, para criar vários "trabalhadores" apenas para utilizar todas as CPUs ou núcleos disponíveis, é melhor usar threads.

Quando você precisar que os trabalhadores estejam melhor isolados e mais robustos, como acontece com a maioria dos servidores, opte por soquetes.Quando um thread trava gravemente, geralmente interrompe todo o processo, incluindo outros threads que trabalham nesse processo.Se um processo azedar e morrer, ele não afeta nenhum outro processo, então eles podem continuar felizes com seus negócios como se nada tivesse acontecido.

Outras dicas

Os processos têm mais memória isolada.Isso é importante por vários motivos:

  • É mais difícil para uma única tarefa travar as outras tarefas.
  • Mais memória estará disponível por processo.Isso é importante para aplicativos grandes e de alto desempenho, como Apache, ou servidores de banco de dados, como Postgres.Isso é importante tanto para a memória alocada quanto para os arquivos mapeados na memória.

O grau de paralelismo depende principalmente dos processadores/núcleos físicos disponíveis em sua máquina.Se você tiver uma máquina com processador/núcleo único, ter processos separados poderá causar muita sobrecarga.Threads geralmente seriam preferidos nesse caso.

Se você tiver vários núcleos/CPUs, dependendo do que cada processo/thread faz, você poderá optar por processos se a sobrecarga for justificada.Obviamente, os processos têm um nível de isolamento de memória muito melhor do que os threads - mas, ao mesmo tempo, no Windows, os processos são bastante pesados, comparados aos threads.

É claro que os threads podem compartilhar dados no mesmo processo - mas, novamente, você precisaria sincronizar o acesso aos dados compartilhados - para evitar um estado corrompido.O compartilhamento de dados entre processos é mais complicado, a sobrecarga (que é maior do que a simples sincronização de threads) depende dos mecanismos usados, como pipes nomeados, comunicação baseada em soquetes personalizados, uso de uma estrutura de comunicação remota, arquivo/banco de dados compartilhado, etc.

Geralmente você deve usar processos quando os fluxos de execução individuais não precisam compartilhar dados globais e você gostaria de ter cada um protegido um do outro.

No Windows, os processos são mais pesados ​​para criar threads.Portanto, se você tiver várias tarefas menores, um thread ou pool de threads seria melhor.Ou use um pool de processos para reciclar os processos.Além disso, compartilhar o estado entre processos é mais trabalhoso do que compartilhar o estado entre threads.Mas então novamente:Threads podem desestabilizar um processo completo, levando consigo outros threads.Se você quiser minimizar a chance de isso acontecer, você pode optar por processos separados.Os AppDomains da .Net podem ser um meio termo entre ambos.

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