Como articular a diferença entre programação assíncrona e paralela?


138

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.


Eu escrevi um post sobre a relação entre programação assíncrona e paralela - anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov


6
paralelismo é quando as coisas acontecem simultaneamente. Assincronismo é quando você não se preocupa em esperar o resultado de uma ação para continuar. Você acabou de dormir e, em algum momento posterior, o resultado chega, toca a campainha, você acorda e continua a partir daí. A execução assíncrona pode perfeitamente acontecer em série em apenas um thread. (isso é basicamente o que o javascript faz) #
Thanasis Ioannidis

Respostas:


87

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.


Deixe-me ver se entendi. As tarefas paralelas de renderização dos diferentes quadros devem ser espalhadas por várias CPUs / núcleos. Isso não tem nada a ver com o tempo da conclusão da tarefa ou se essa tarefa bloqueia outra coisa. Significa apenas que várias CPUs farão isso juntas e disponibilizarão o resultado como se fosse executado em uma CPU super rápida. Certo?

1
"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 (...)". O que?

Para a parte da animação 3D: Antes de tudo, você NUNCA executaria um programa de gráficos 3D com quadros de geração na CPU - qualquer pessoa sã sugeriria imediatamente o uso da GPU. Em segundo lugar, se fizermos isso (altamente desencorajado), usaremos um timer para medir quantos quadros podemos renderizar; caso contrário, poderemos acabar construindo uma pilha de tarefas de chamada de renderização inacabadas. Mas seu argumento é perfeitamente válido com a maioria dos aplicativos de renderização em 2D que são renderizados com base em eventos de entrada por usuário.
21419 Fase

1
Assíncrono e sem bloqueio são diferentes paradigmas.
Marquês de Lorne #

72

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:

Um modelo de computação é um modelo para simultaneidade quando é capaz de representar sistemas como compostos por componentes autônomos independentes, possivelmente se comunicando. A noção de simultaneidade não deve ser confundida com a noção de paralelismo. Cálculos paralelos geralmente envolvem um controle central que distribui o trabalho entre vários processadores. Simultaneamente, enfatizamos a independência dos componentes e o fato de eles se comunicarem. O paralelismo é como o Egito antigo, onde o faraó decide e os escravos trabalham. A concorrência é como a Itália moderna, onde todos fazem o que querem e todos usam telefones celulares.

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 .


37

Este artigo explica muito bem: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

Tem isso sobre programação assíncrona:

Chamadas assíncronas são usadas para impedir o "bloqueio" dentro de um aplicativo. [Essa] chamada será desativada em um encadeamento já existente (como um encadeamento de E / S) e executará sua tarefa quando puder.

isso sobre programação paralela:

Na programação paralela, você ainda divide o trabalho ou as tarefas, mas as principais diferenças são que você cria novos threads para cada pedaço de trabalho

e isso em resumo:

as chamadas assíncronas usarão threads já em uso pelo sistema e a programação paralela exige que o desenvolvedor interrompa os threads de trabalho, spinup e desmontagem necessários .


3
Este artigo> todas as respostas aqui (exceto para um presente, é claro!)
FellyTone84

1
Obrigado pelo link. Então ... em geral , use chamadas assíncronas ao se comunicar da interface do usuário com o servidor (ou de um cliente para um serviço da web). Use o encadeamento paralelo no servidor ou no final do serviço da web, bem como na camada de negócios.
Goku_da_master

18

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.


Isso é bem colocado, mas está completamente errado. Como a assincronicidade, o paralelismo também permite que o fluxo de controle continue sem esperar que as ações sejam concluídas. A principal diferença é que o paralelismo depende do hardware.
serkan 28/02

13

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.


13

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.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

a principal diferença é o paralelismo depende principalmente do hardware.


11

É 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.


9

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.


5

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.


4

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.


4

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.


2

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.


-1

Resumo de todas as respostas acima

  1. computação paralela:

▪ 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

  1. assíncrono:

▪ 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.