Muitas plataformas promovem assincronia e paralelismo como meio para melhorar a capacidade de resposta. Compreendo a diferença em geral, mas muitas vezes acho difícil articular em minha própria mente, assim como nos outros.
Sou programador de rotina e uso assíncrono e retornos de chamada com bastante frequência. Paralelismo parece exótico.
Mas sinto que eles são facilmente confundidos, especialmente no nível do design da linguagem. Adoraria uma descrição clara de como eles se relacionam (ou não) e as classes de programas em que cada um é melhor aplicado.
multithreading
asynchronous
parallel-processing
Matt Sherman
fonte
fonte
Respostas:
Quando você executa algo de forma assíncrona, significa que não está bloqueando, você o executa sem esperar que ele seja concluído e continue com outras coisas. Paralelismo significa executar várias coisas ao mesmo tempo, em paralelo. O paralelismo funciona bem quando você pode separar tarefas em partes independentes do trabalho.
Tomemos, por exemplo, os quadros de renderização de uma animação 3D. Para renderizar a animação leva muito tempo, portanto, se você iniciar a renderização a partir do seu software de edição de animação, certifique-se de que ele esteja sendo executado de forma assíncrona, para não bloquear a interface do usuário e continuar fazendo outras coisas. Agora, cada quadro dessa animação também pode ser considerado como uma tarefa individual. Se tivermos várias CPUs / núcleos ou várias máquinas disponíveis, podemos renderizar vários quadros em paralelo para acelerar a carga de trabalho geral.
fonte
Eu acredito que a principal distinção é entre concorrência e paralelismo .
Assíncrono e retornos de chamada são geralmente uma maneira (ferramenta ou mecanismo) de expressar simultaneidade, ou seja, um conjunto de entidades possivelmente conversando entre si e compartilhando recursos. No caso de comunicação assíncrona ou de retorno de chamada, está implícito enquanto o compartilhamento de recursos é opcional (considere o RMI onde os resultados são calculados em uma máquina remota). Como corretamente observado, isso geralmente é feito com a capacidade de resposta em mente; para não esperar por eventos de longa latência .
A programação paralela geralmente tem como objetivo principal a taxa de transferência, enquanto a latência, ou seja, o tempo de conclusão de um único elemento, pode ser pior que um programa seqüencial equivalente.
Para entender melhor a distinção entre simultaneidade e paralelismo, vou citar os modelos probabilísticos de simultaneidade de Daniele Varacca, que é um bom conjunto de notas para a teoria da simultaneidade:
Em conclusão , a programação paralela é um caso especial de simultaneidade, em que entidades separadas colaboram para obter alto desempenho e taxa de transferência (geralmente).
Async e Callbacks são apenas um mecanismo que permite ao programador expressar simultaneidade. Considere que os conhecidos padrões de design de programação paralela, como mestre / trabalhador ou mapear / reduzir, são implementados por estruturas que usam mecanismos de nível inferior (assíncrono) para implementar interações centralizadas mais complexas .
fonte
Este artigo explica muito bem: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming
Tem isso sobre programação assíncrona:
isso sobre programação paralela:
e isso em resumo:
fonte
Meu entendimento básico é:
A programação assíncrona resolve o problema de aguardar a conclusão de uma operação cara antes que você possa fazer qualquer outra coisa. Se você pode fazer outras coisas enquanto aguarda a conclusão da operação, isso é uma coisa boa. Exemplo: mantendo uma interface do usuário em execução enquanto você recupera mais dados de um serviço da web.
A programação paralela está relacionada, mas está mais preocupada em dividir uma tarefa grande em partes menores que podem ser computadas ao mesmo tempo. Os resultados dos pedaços menores podem ser combinados para produzir o resultado geral. Exemplo: rastreamento de raios em que a cor de pixels individuais é essencialmente independente.
Provavelmente é mais complicado que isso, mas acho que essa é a distinção básica.
fonte
Costumo pensar na diferença nestes termos:
Assíncrono: Vá embora e execute esta tarefa, quando terminar, volte e diga-me e traga os resultados. Enquanto isso, continuarei com outras coisas.
Paralelo: quero que você faça essa tarefa. Se facilitar, peça ajuda a algumas pessoas. Isso é urgente, então espero aqui até você voltar com os resultados. Não posso fazer mais nada até você voltar.
É claro que uma tarefa assíncrona pode fazer uso do paralelismo, mas a diferenciação - pelo menos na minha opinião - é se você continua com outras coisas enquanto a operação está sendo executada ou se você interrompe tudo completamente até que os resultados cheguem.
fonte
assíncrono : faça isso sozinho em outro lugar e notifique-me quando concluir (retorno de chamada). No momento em que eu puder continuar a fazer minhas coisas.
paralelo : contrate quantos caras (threads) você desejar e divida o trabalho com eles para concluir mais rapidamente e me avise (retorno de chamada) quando concluir. Quando eu puder continuar fazendo minhas outras coisas.
a principal diferença é o paralelismo depende principalmente do hardware.
fonte
É uma questão de ordem de execução.
Se A é assíncrono com B, não posso prever de antemão quando as subpartes de A ocorrerão em relação às subpartes de B.
Se A é paralelo a B, as coisas em A estão acontecendo ao mesmo tempo que as coisas em B. No entanto, uma ordem de execução ainda pode ser definida.
Talvez a dificuldade seja que a palavra assíncrona seja equívoca.
Executo uma tarefa assíncrona quando digo ao meu mordomo que corra até a loja para pegar mais vinho e queijo, e depois esquecê-lo e trabalhar no meu romance até ele bater na porta do escritório novamente. O paralelismo está acontecendo aqui, mas o mordomo e eu estamos envolvidos em tarefas fundamentalmente diferentes e de diferentes classes sociais, por isso não aplicamos esse rótulo aqui.
Minha equipe de empregadas trabalha em paralelo quando cada uma delas está lavando uma janela diferente.
Minha equipe de suporte de carros de corrida é assincronamente paralela, pois cada equipe trabalha com um pneu diferente e não precisa se comunicar nem gerenciar recursos compartilhados enquanto faz seu trabalho.
Meu time de futebol (também conhecido como futebol) trabalha em paralelo, pois cada jogador processa informações sobre o campo de forma independente e se move sobre ele, mas não é totalmente assíncrono porque deve se comunicar e responder à comunicação de outros.
Minha banda também é paralela à medida que cada jogador lê música e controla seu instrumento, mas eles são altamente síncronos: tocam e marcham no tempo entre si.
Uma metralhadora com cames poderia ser considerada paralela, mas tudo é 100% síncrono, por isso é como se um processo estivesse avançando.
fonte
Por que assíncrono?
Com o aplicativo de hoje em dia, cada vez mais, tarefas cada vez mais conectadas e potencialmente em execução ou operações de bloqueio, como E / S de rede ou Operações de banco de dados, é muito importante ocultar a latência dessas operações iniciando-as em segundo plano e retornando à interface do usuário o mais rápido possível. Aqui assíncronas entram em cena, Responsividade .
Por que programação paralela?
Com os conjuntos de dados de hoje cada vez maiores e os cálculos cada vez mais complexos. Portanto, é muito importante reduzir o tempo de execução dessas operações ligadas à CPU, nesse caso, dividindo a carga de trabalho em partes e, em seguida, executando essas partes simultaneamente. Podemos chamar isso de "Paralelo". Obviamente, ele dará alto desempenho à nossa aplicação.
fonte
Assíncrono Digamos que você é o ponto de contato do seu cliente e precisa ser responsivo, ou seja, é necessário compartilhar o status, a complexidade da operação, os recursos necessários etc. sempre que solicitado. Agora você tem uma operação demorada a ser realizada e, portanto, não pode aceitar isso, pois precisa responder ao cliente 24 horas por dia, 7 dias por semana. Portanto, você delega a operação demorada para outra pessoa, para que você possa ser responsivo. Isso é assíncrono.
Programação paralela Digamos que você tenha uma tarefa para ler, digamos, 100 linhas de um arquivo de texto, e a leitura de uma linha leva 1 segundo. Portanto, você precisará de 100 segundos para ler o arquivo de texto. Agora você está preocupado que o cliente precise esperar 100 segundos para a operação terminar. Portanto, você cria mais 9 clones e faz com que cada um deles leia 10 linhas do arquivo de texto. Agora, o tempo necessário é de apenas 10 segundos para ler 100 linhas. Portanto, você tem melhor desempenho.
Em resumo, a codificação assíncrona é feita para obter capacidade de resposta e a programação paralela é feita para desempenho.
fonte
Assíncrono: executando um método ou tarefa em segundo plano, sem bloquear. Pode não ser necessariamente executado em um thread separado. Usa alternância de contexto / programação de tempo.
Tarefas paralelas: cada tarefa é executada paralelamente. Não usa a alternância de contexto / programação de tempo.
fonte
Eu vim aqui bastante confortável com os dois conceitos, mas com algo não claro para mim sobre eles.
Depois de ler algumas das respostas, acho que tenho uma metáfora correta e útil para descrever a diferença.
Se você pensa em suas linhas de código individuais como cartas de baralho separadas mas ordenadas (pare-me se eu estiver explicando como os cartões perfurados da velha escola funcionam), então, para cada procedimento separado escrito, você terá uma pilha única de cartas (não copiar e colar!) ea diferença entre o que normalmente acontece quando o código é executado normalmente e de forma assíncrona depende se você se importa ou não.
Ao executar o código, você entrega ao sistema operacional um conjunto de operações únicas (nas quais seu compilador ou intérprete quebrou o código de nível "superior") a ser passado ao processador. Com um processador, apenas uma linha de código pode ser executada ao mesmo tempo. Portanto, para realizar a ilusão de executar vários processos ao mesmo tempo, o sistema operacional usa uma técnica na qual envia ao processador apenas algumas linhas de um determinado processo por vez, alternando entre todos os processos de acordo com a forma como vê em forma. O resultado são vários processos que mostram o progresso para o usuário final no que parece ser ao mesmo tempo.
Para nossa metáfora, o relacionamento é que o sistema operacional sempre embaralha as placas antes de enviá-las ao processador. Se sua pilha de cartas não depender de outra pilha, você não notará que sua pilha parou de ser selecionada enquanto outra pilha se tornou ativa. Então, se você não se importa, não importa.
No entanto, se você se importa (por exemplo, existem vários processos - ou pilhas de cartões - que dependem um do outro), o embaralhamento do sistema operacional estraga seus resultados.
A escrita de código assíncrono exige o tratamento das dependências entre a ordem de execução, independentemente do que essa ordem acaba sendo. É por isso que construções como "retornos de chamada" são usadas. Eles dizem ao processador: "a próxima coisa a fazer é contar à outra pilha o que fizemos". Ao usar essas ferramentas, você pode ter certeza de que a outra pilha é notificada antes de permitir que o sistema operacional execute mais instruções. ("Se chamado_back == false: send (no_operation)" - não tenho certeza se é assim que realmente é implementado, mas logicamente, acho que é consistente.)
Para processos paralelos, a diferença é que você tem duas pilhas que não se importam uma com a outra e dois trabalhadores para processá-las. No final do dia, pode ser necessário combinar os resultados das duas pilhas, o que seria uma questão de sincronicidade, mas, para execução, você não se importa mais.
Não tenho certeza se isso ajuda, mas sempre achei várias explicações úteis. Além disso, observe que a execução assíncrona não é restrita a um computador individual e seus processadores. De um modo geral, lida com o tempo ou (ainda mais de maneira geral) uma ordem de eventos. Portanto, se você enviar a pilha dependente A para o nó de rede X e sua pilha acoplada B para Y, o código assíncrono correto deverá ser capaz de dar conta da situação como se estivesse em execução localmente no seu laptop.
fonte
Geralmente, existem apenas duas maneiras pelas quais você pode fazer mais de uma coisa por vez. Um é assíncrono , o outro é paralelo .
Do alto nível, como o popular servidor NGINX e a famosa biblioteca Python Tornado , ambos utilizam totalmente o paradigma assíncrono, que é o servidor Single thread, que pode atender simultaneamente a milhares de clientes (alguns IOloop e callback ). Usando ECF (controle de exceção a seguir) que pode implementar o paradigma de programação assíncrona. portanto, asynchronous às vezes não faz nada simultâneo, mas algum trabalho vinculado io, assíncrono pode realmente promover o desempenho.
O paradigma paralelo sempre se refere a multiencadeamento e multiprocessamento. Isso pode utilizar totalmente processadores com vários núcleos, fazer as coisas de maneira simultânea.
fonte
Resumo de todas as respostas acima
▪ resolve o problema de taxa de transferência. Preocupado em dividir uma tarefa grande em pedaços menores
▪ está relacionado à máquina (é necessário usar várias máquinas / núcleo / CPU / processador), por exemplo: mestre escravo, redução de mapa.
Cálculos paralelos geralmente envolvem um controle central que distribui o trabalho entre vários processadores
▪ resolve o problema de latência, ou seja, o problema de 'esperar' por uma operação cara para concluir antes que você possa fazer qualquer outra coisa
▪ está relacionado a threads (é necessário vários threads)
O encadeamento (usando Thread, Runnable, Executor) é uma maneira fundamental de executar operações assíncronas em Java
fonte