Qual é a diferença entre execução assíncrona e síncrona?
Qual é a diferença entre execução assíncrona e síncrona?
Respostas:
Quando você executa algo de forma síncrona, aguarda o término antes de prosseguir para outra tarefa. Quando você executa algo de forma assíncrona, pode passar para outra tarefa antes que ela termine.
Dito isto, no contexto dos computadores, isso se traduz na execução de um processo ou tarefa em outro "encadeamento". Um encadeamento é uma série de comandos (um bloco de código) que existe como uma unidade de trabalho. O sistema operacional pode gerenciar vários segmentos e atribuir a um segmento uma parte ("fatia") do tempo do processador antes de alternar para outro segmento, para que ele possa trabalhar um pouco. Na essência (perdoe o trocadilho), um processador pode simplesmente executar um comando, não tem o conceito de fazer duas coisas ao mesmo tempo. O sistema operacional simula isso alocando fatias de tempo para diferentes segmentos.
Agora, se você introduzir vários núcleos / processadores no mix, as coisas poderão realmente acontecer ao mesmo tempo. O sistema operacional pode alocar tempo para um encadeamento no primeiro processador e, em seguida, alocar o mesmo bloco de tempo para outro encadeamento em um processador diferente. Tudo isso é sobre permitir que o sistema operacional gerencie a conclusão de sua tarefa enquanto você pode prosseguir no seu código e fazer outras coisas.
A programação assíncrona é um tópico complicado devido à semântica de como as coisas se unem quando você pode fazê-las ao mesmo tempo. Existem inúmeros artigos e livros sobre o assunto; dar uma olhada!
Síncrono / Assíncrono NÃO TEM NADA A VER COM MULTI-ROSCA.
Síncrono ou Sincronizado significa "conectado" ou "dependente" de alguma forma. Em outras palavras, duas tarefas síncronas devem estar cientes uma da outra e uma tarefa deve ser executada de alguma maneira dependente da outra, como esperar para iniciar até que a outra tarefa seja concluída.
Assíncrono significa que eles são totalmente independentes e nenhum deles deve considerar o outro de forma alguma, nem na iniciação nem na execução.
Síncrono (um segmento):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Síncrono (multithread):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Assíncrono (um segmento):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Assíncrono (multithread):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
caracteres.|
Tecnicamente, o conceito de síncrono / assíncrono realmente não tem nada a ver com threads . Embora, em geral, seja incomum encontrar tarefas assíncronas em execução no mesmo encadeamento, é possível (veja exemplos abaixo) e é comum encontrar duas ou mais tarefas executadas de forma síncrona em encadeamentos separados ... Não, o conceito de síncrono / assíncrono tem a ver apenas com o fato de uma segunda tarefa ou uma tarefa subsequente poder ser iniciada antes que a outra (primeira) tarefa seja concluída ou se deve esperar. Isso é tudo. Para qual thread (ou threads), ou processos, ou CPUs, ou mesmo qual hardware, as tarefas são executadas não são relevantes. De fato, para explicar isso, editei os gráficos para mostrar isso.
EXEMPLO ASSÍNCRONO:
Na solução de muitos problemas de engenharia, o software foi projetado para dividir o problema geral em várias tarefas individuais e depois executá-las de forma assíncrona. A inversão de uma matriz, ou um problema de análise de elementos finitos, são bons exemplos. Na computação, classificar uma lista é um exemplo. A rotina quicksort, por exemplo, divide a lista em duas listas e executa uma quicksort em cada uma delas, chamando a si mesma (quicksort) recursivamente. Nos dois exemplos acima, as duas tarefas podem (e geralmente foram) executadas de forma assíncrona. Eles não precisam estar em threads separados. Mesmo uma máquina com uma CPU e apenas um segmento de execução pode ser codificada para iniciar o processamento de uma segunda tarefa antes da conclusão da primeira. O único critério é que os resultados de uma tarefa não sejam necessários como entradas para a outra tarefa. Contanto que os horários de início e término das tarefas se sobreponham (possível apenas se a saída de nenhuma for necessária como entrada para a outra), eles serão executados de forma assíncrona, independentemente de quantos threads estejam em uso.
EXEMPLO SINCRONIZADO:
Qualquer processo que consiste em várias tarefas em que as tarefas devem ser executadas em sequência, mas uma deve ser executada em outra máquina (Buscar e / ou atualizar dados, obter uma cotação de ações do serviço financeiro, etc.). Se estiver em uma máquina separada, estará em um encadeamento separado, síncrono ou assíncrono.
Em termos mais simples:
SÍNCRONO
Você está em uma fila para obter um ingresso de cinema. Você não pode conseguir um até que todos na sua frente consigam um, e o mesmo se aplica às pessoas na fila atrás de você.
ASSÍNCRONO
Você está em um restaurante com muitas outras pessoas. Você pede sua comida. Outras pessoas também podem pedir a comida, não precisam esperar que a comida seja cozida e servida antes de pedir. Na cozinha, os trabalhadores do restaurante estão cozinhando, servindo e recebendo pedidos continuamente. As pessoas receberão sua comida assim que estiver cozida.
Execução síncrona
Meu chefe é um homem ocupado. Ele me diz para escrever o código. Eu digo a ele: Tudo bem. Eu começo e ele está me olhando como um abutre, parado atrás de mim, do meu ombro. Estou tipo "Cara, WTF: por que você não faz alguma coisa enquanto eu termino isso?"
ele é como: "Não, eu estou esperando aqui até você terminar." Isso é síncrono.
Execução assíncrona
O chefe me diz para fazê-lo e, em vez de esperar ali pelo meu trabalho, o chefe sai e faz outras tarefas. Quando termino meu trabalho, simplesmente reporto ao meu chefe e digo: "Estou CONCLUÍDO!" Esta é a execução assíncrona.
(Siga meu conselho: NUNCA trabalhe com o chefe atrás de você.)
Execução síncrona significa que a execução ocorre em uma única série. A->B->C->D
. Se você estiver chamando essas rotinas, A
executará, terminará, B
iniciará, terminará, C
iniciará etc.
Com a execução assíncrona , você inicia uma rotina e a deixa em segundo plano enquanto inicia a próxima e, em algum momento, diga "aguarde o término". É mais como:
Iniciar A->B->C->D->
Wait para A
ao fim
A vantagem é que você pode executar B
, C
e ou D
enquanto A
ainda estiver em execução (em segundo plano, em um encadeamento separado), para que você possa aproveitar melhor seus recursos e ter menos "travamentos" ou "esperas".
Em poucas palavras, sincronização refere-se a dois ou mais pontos de início e término de processos , NÃO suas execuções . Neste exemplo, o ponto final do Processo A é sincronizado com o ponto inicial do Processo B:
SÍNCRONO | -------- A -------- | | -------- B -------- |
Os processos assíncronos, por outro lado, não têm seus pontos de início e de extremidade sincronizados:
ASSÍNCRONO | -------- A -------- | | -------- B -------- |
Onde o Processo A se sobrepõe ao Processo B, eles estão executando simultaneamente ou de forma síncrona (definição de dicionário), daí a confusão.
ATUALIZAÇÃO: Charles Bretana melhorou sua resposta , então agora essa resposta é apenas um mnemônico simples (potencialmente simplificado).
Síncrono significa que o chamador aguarda a resposta ou conclusão, assíncrono que o chamador continua e uma resposta vem mais tarde (se aplicável).
Como um exemplo:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Isso sempre produzirá:
Before call
In call
After call
Mas se tornássemos doSomething assíncrono (várias maneiras de fazê-lo), a saída poderia se tornar:
Before call
After call
In call
Porque o método que faz a chamada assíncrona continuaria imediatamente com a próxima linha de código. Eu digo "poderia", porque a ordem de execução não pode ser garantida com operações assíncronas. Também pode ser executado como o original, dependendo do tempo de thread, etc.
Eu acho que essa é uma explicação um pouco abrangente, mas ainda esclarece usando o exemplo da vida real.
Exemplo pequeno:
Digamos que a reprodução de um áudio envolva três etapas:
Se o seu reprodutor de áudio executar 1,2,3 seqüencialmente para cada música, ele será sincronizado. Você terá que esperar algum tempo para ouvir a música até que ela seja realmente buscada e descompactada.
Se o seu reprodutor de áudio executar uma etapa 1,2,3 independente um do outro, será assíncrono. ie Durante a reprodução do áudio 1 (etapa 3), se ele buscar o áudio 3 do disco rígido em paralelo (etapa 1) e descomprimir o áudio 2 em paralelo. (passo 2) Você acabará ouvindo a música sem esperar muito para buscar e descomprimir.
As operações de sincronização e assíncrona tratam da ordem de execução de uma nova tarefa em relação à tarefa atual. Duas tarefas em uma tabela: tarefa atual e uma nova tarefa
Síncrono (bloqueio) - implica que as tarefas serão executadas uma a uma. Uma próxima tarefa é iniciada somente após a conclusão da tarefa anterior. Task 2
não é iniciado até Task 1
terminar
Assíncrono (sem bloqueio) - implica que a tarefa retorna o controle imediatamente com a promessa de executar um código e notificar o resultado posteriormente (por exemplo, retorno de chamada, recurso). Task 2
é executado mesmo se Task 1
não estiver terminado
Portanto, responda sobre sincronização e assíncrona: no iOS , no Android
Simplesmente disse que a execução assíncrona está fazendo coisas em segundo plano.
Por exemplo, se você quiser baixar um arquivo da Internet, poderá usar uma função síncrona para fazer isso, mas ele bloqueará seu encadeamento até o término do download do arquivo. Isso pode fazer com que seu aplicativo não responda a qualquer entrada do usuário.
Em vez disso, você pode baixar o arquivo em segundo plano usando o método assíncrono. Nesse caso, a função de download retorna imediatamente e a execução do programa continua normalmente. Todas as operações de download são feitas em segundo plano e seu programa será notificado quando terminar.
Como um exemplo realmente simples,
SÍNCRONO
Imagine 3 alunos da escola instruídos a fazer uma corrida de revezamento em uma estrada.
O primeiro aluno percorre sua distância, para e passa o bastão para o segundo. Ninguém mais começou a correr.
1------>
2.
3.
Quando o 2º aluno recupera o bastão, ela começa a correr sua distância.
1.
2------>
3.
A 2ª aluna desamarrou o cadarço. Agora ela parou e amarrou novamente. Por esse motivo, o horário de término do segundo turno foi prorrogado e o horário de início do terceiro turno.
1.
--2.--->
3.
Esse padrão continua até o dia 3 recuperar o bastão do 2º e terminar a corrida.
ASSÍNCRONO
Imagine 10 pessoas aleatórias andando na mesma estrada. Eles não estão em uma fila, é claro, apenas caminhando aleatoriamente em diferentes lugares da estrada em diferentes ritmos.
O cadarço da 2ª pessoa se desamarrou. Ela parou para amarrá-lo novamente.
Mas ninguém está esperando que ela o amarre. Todo mundo ainda está andando da mesma maneira que antes, no mesmo ritmo deles.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Eu criei um gif para explicar isso, espero ser útil: olha, a linha 3 é assíncrona e outras são síncronas. todas as linhas antes da linha 3 devem esperar até que a linha termine seu trabalho, mas, como a linha 3 é assíncrona, a próxima linha (linha 4) não espera pela linha 3, mas a linha 5 deve esperar a linha 4 concluir seu trabalho, e a linha 6 deve esperar pela linha 5 e 7 pela 6, porque a linha 4,5,6,7 não é assíncrona.
Ao executar uma sequência como: a> b> c> d>, se tivermos uma falha no meio da execução, como:
a
b
c
fail
Então, recomeçamos do começo:
a
b
c
d
isso é síncrono
Se, no entanto, tivermos a mesma sequência a ser executada: a> b> c> d>, e tivermos uma falha no meio:
a
b
c
fail
... mas em vez de reiniciar desde o início, reiniciaremos a partir do ponto de falha:
c
d
... isso é conhecido como assíncrono.
Você está confundindo Synchronous com Parallel vs Series. Média síncrona, tudo ao mesmo tempo. Meios sincronizados relacionados entre si, que podem significar em série ou em um intervalo fixo. Enquanto o programa está fazendo tudo, ele é executado em série. Obter um dicionário ... é por isso que tomamos chá sem açúcar. Você toma chá ou chá adoçado.
Síncrono significa basicamente que você só pode executar uma coisa de cada vez. Assíncrono significa que você pode executar várias coisas ao mesmo tempo e não precisa concluir a execução da coisa atual para passar à próxima.
Use um exemplo de instruções para fazer um café da manhã
Se você tiver experiência em cozinhar, execute essas instruções de forma assíncrona. você começaria a aquecer a panela para ovos e depois o bacon. Você colocava o pão na torradeira e depois começava os ovos. Em cada etapa do processo, você inicia uma tarefa e volta sua atenção para as tarefas que estão prontas para sua atenção.
O café da manhã é um bom exemplo de trabalho assíncrono que não é paralelo. Uma pessoa (ou thread) pode lidar com todas essas tarefas. Continuando a analogia do café da manhã, uma pessoa pode fazer o café da manhã de forma assíncrona iniciando a próxima tarefa antes da conclusão da primeira. O cozimento progride se alguém está assistindo ou não. Assim que você começar a aquecer a panela para os ovos, você pode começar a fritar o bacon. Quando o bacon começar, você pode colocar o pão na torradeira.
Para um algoritmo paralelo, você precisaria de vários cozinheiros (ou threads). Um faria os ovos, um o bacon, e assim por diante. Cada um seria focado apenas nessa tarefa. Cada cozinheiro (ou linha) seria bloqueado de forma síncrona, esperando que o bacon estivesse pronto para virar ou a torrada estourasse.
Referência dos conceitos de programação assíncrona
Uma operação síncrona faz seu trabalho antes de retornar ao chamador.
Uma operação assíncrona faz (a maioria ou todo) o seu trabalho após retornar ao chamador.
Com relação à definição " ao mesmo tempo " de execução síncrona (que às vezes é confusa), aqui está uma boa maneira de entendê-la:
Execução síncrona : todas as tarefas em um bloco de código são executadas ao mesmo tempo.
Execução assíncrona : todas as tarefas em um bloco de código não são todas executadas ao mesmo tempo.
Eu acho que uma boa maneira de pensar nisso é um clássico de corrida de revezamento
Síncrono : Processos como membros da mesma equipe, eles não serão executados até receberem o bastão (final da execução do processo / corredor anterior) e, no entanto, todos estão agindo em sincronia.
Assíncrono : onde processos como membros de equipes diferentes na mesma pista de corrida de revezamento, eles correm e param, assíncronos entre si, mas dentro da mesma corrida (execução geral do programa).
Isso faz sentido?
Uma definição diferente em inglês de Synchronize está aqui
Coordenada; combinar.
Eu acho que é uma definição melhor do que "Acontecendo ao mesmo tempo". Essa também é uma definição, mas não acho que seja a que se encaixa da maneira como é usada na Ciência da Computação.
Portanto, uma tarefa assíncrona não é co-coordenada com outras tarefas, enquanto uma tarefa síncrona é co-coordenada com outras tarefas, portanto, uma é concluída antes que a outra seja iniciada.
Como isso é alcançado é uma questão diferente.
Síncrono significa que a execução do modo de fila, uma a uma, será executada. Suponha que haja apenas um veículo que precise ser compartilhado entre amigos para chegar ao seu destino, um por um veículo seja compartilhado.
No caso assíncrono, cada amigo pode alugar um veículo e chegar ao seu destino.
Sim, significa síncrono ao mesmo tempo, literalmente, significa trabalhar todos juntos. vários objetos / humanos no mundo podem fazer várias coisas ao mesmo tempo, mas se olharmos para o computador, ele diz que significa síncrono onde os processos funcionam juntos, ou seja, os processos dependem do retorno um do outro e é por isso que eles são executados. depois do outro na sequência correta. Enquanto assíncrono significa que os processos não funcionam juntos, eles podem funcionar ao mesmo tempo (se houver multithread), mas funcionam independentemente.