O significado de assíncrono vs síncrono [fechado]


46

Qual é o significado das palavras assíncronas e síncronas na ciência da computação?

Se você pesquisar no google o significado das palavras, obterá o seguinte:

Mas parece que eles são usados ​​para transmitir o significado oposto em programação ou ciência da computação:

O atributo assíncrono HTML significa que o script será executado assim que for baixado, mesmo que o HTML ainda esteja analisando ou baixando, o que significa que ambos os processos, o script e o HTML, existem e ocorrem ao mesmo tempo para mim.

Esses termos são usados ​​para transmitir o significado oposto na ciência da computação ou estou esquecendo o ponto?


47
Acho fácil dizer: se eu não entendo como o código funciona e se os bugs desaparecem repentinamente quando os procuro, o código provavelmente é assíncrono. :)
Eric Duminil

4
A triste verdade é que, no domínio da programação, com o tempo essas palavras passaram a significar o inverso do que elas significam. Pode haver razões históricas para seus significados atuais, mas não há uma boa justificativa.
Segredo de Solomonoff

3
Ao mesmo tempo em que , é a chave :)
Lightness Races with Monica

5
A operação real não (necessariamente) ocorrem ao mesmo tempo que a função é invocada contra a operação não ocorrer ao mesmo tempo a função é chamada ... não parece para trás para mim? Se eu descrever uma função como assíncrona, estou dizendo que tudo o que ela faz não garante que ocorra ao mesmo tempo que você a chama.
Affe 28/08

2
"sequencial" e "não sequencial" podem ter sido melhores escolhas semanticamente, mas esse navio já está navegando.
Jared Smith

Respostas:


47

Gostaria de dar uma resposta diretamente relacionada às definições que você encontrou. Quando uma tarefa T1 inicia uma segunda tarefa T2, isso pode ocorrer da seguinte maneira:

Síncrono: existente ou ocorrendo ao mesmo tempo.

Portanto, é garantido que o T2 seja iniciado e executado dentro do intervalo de tempo de T1 . T1 "aguarda" o final de T2 e pode continuar o processamento posteriormente. Nesse sentido, T1 e T2 ocorrem "ao mesmo tempo" (não "em paralelo", mas em um intervalo de tempo contíguo).

Assíncrono: não existe ou ocorre ao mesmo tempo.

Portanto, o tempo de execução do T2 agora não está relacionado ao T1. Pode ser executado em paralelo, pode ocorrer um segundo, um minuto ou várias horas depois, e o T2 ainda pode ser executado quando o T1 terminar (para processar um resultado do T2, uma nova tarefa T3 pode ser necessária). Nesse sentido, T1 e T2 não estão "ocorrendo ao mesmo tempo (intervalo)".

Obviamente, concordo que as definições literais parecem ambíguas ao constatar que as operações assíncronas hoje em dia são frequentemente usadas para criar execuções paralelas.


4
É uma pena que isso tenha tantos votos positivos, porque acho incorreto. Os métodos síncronos são executados um após o outro, porque o segundo método deve aguardar a conclusão do primeiro método (bloqueio). Esses dois métodos decididamente não estão sendo executados ao mesmo tempo.
Robert Harvey

6
Não, acho que não. Sincronia e simultaneidade não são a mesma coisa.
Robert Harvey

1
Estou disposto a afirmar que as definições de dicionário não são muito úteis para desenvolvedores de software. Tentar mapear as definições do dicionário para os termos técnicos que usamos provavelmente não é útil.
Robert Harvey

1
De qualquer forma, sua edição melhora as coisas, mas as palavras "existentes ou ocorrendo ao mesmo tempo" confundem suas descrições. Métodos síncronos não são executados "ao mesmo tempo"; eles são executados em uma sequência ordenada , que é o que os torna síncronos.
Robert Harvey

1
@RobertHarvey As definições de dicionário funcionam perfeitamente bem se você usar a perspectiva correta. Vocês estão todos obcecados com o tempo de execução. As instruções têm uma vida útil fora de quando são executadas. As instruções seqüenciais se movem de forma síncrona da mesma maneira que as balas de um revólver se movem de forma síncrona. Da mesma forma, as instruções podem se mover de forma síncrona pelos pipelines de instruções. Pare de ficar obcecado na perspectiva de execução. Muita porcaria acontece com as instruções antes de serem executadas.
candied_orange 02/09

20

Acho que a melhor maneira de entender é a seguinte:

  • Síncrono: sabemos quando isso acontecerá (acontecerá quando esse outro código terminar).
  • Assíncrono: não sabemos quando isso acontecerá.

Nota: embora possamos programar o código para ser executado em uma determinada hora do relógio, na prática não sabemos quando isso acontecerá, pois pode ser atrasado - até mesmo ignorando a bagunça do relógio do sistema - porque o sistema está ocupado fazendo outra coisa. Além disso, mesmo se tivéssemos a garantia de que isso aconteceria exatamente em um determinado horário, não temos certeza de onde seria a execução do nosso programa naquele momento. Portanto, não, o código agendado para a hora do relógio não é síncrono.


Observe que, no desenvolvimento de software, diremos, por exemplo, que uma tarefa é assíncrona como algo isolado. No entanto, se você quiser defini-lo em termos de ocorrência ao mesmo tempo ou não, precisará ter pelo menos outra coisa para comparar a tarefa.

Muitas plataformas podem executar o paralelismo e a alternância de tarefas, algumas têm paralelismo limitado, outras não podem paralelizar e dependem apenas da alternância de tarefas ... Além disso, algumas plataformas não conseguem interromper uma tarefa e devem concluí-las antes de executar uma diferente. ... Tarefas assíncronas são uma abstração de tudo isso, de modo que o sistema pode decidir como executar as tarefas para a plataforma especificada, sem que o desenvolvedor se preocupe (demais).

Também vale a pena notar que podemos conceitualizar e, geralmente, abstraímos, obtendo informações externas como uma tarefa assíncrona. Por exemplo: obtendo texto da entrada do usuário. Não sabemos quando o usuário digitará. Isso também se aplica à leitura do armazenamento permanente, à obtenção de dados pela rede ou por qualquer outro sistema externo.


A propósito, apesar de algumas coisas serem fundamentalmente assíncronas, geralmente podemos fingir que não são. Fazemos isso fazendo com que o software bloqueie a execução atual - e não faça mais nada - até que ela seja concluída. Ou seja, podemos pegar algo assíncrono e envolvê-lo em uma API síncrona.

Uma API assíncrona permitirá que você continue a execução, apesar da operação solicitada não estar concluída, e uma síncrona não. E a partir daí você obtém a ideia assíncrona - em software - significa que ocorre ao mesmo tempo (simultâneo).

Vale ressaltar que assíncrono não implica simultâneo. Em alguns casos, a plataforma só pode executar a tarefa assíncrona após a conclusão da tarefa atual. Isso seria seqüencial (embora a ordem de execução da tarefa assíncrona não seja necessariamente garantida), não seria simultâneo (não há sobreposição nos períodos de execução), mas seria assíncrono.

Ah, a propósito, em algumas plataformas, o sistema pode decidir alinhar a tarefa assíncrona e, assim, executá-la exatamente como uma operação síncrona (supondo que seja possível, isso não é viável para todas as tarefas).

Novamente, assíncrono significa apenas que você não sabe quando isso acontecerá.


Você também pode estar interessado em A diferença entre execução "simultânea" e "paralela"? .


Exatamente. A descrição encontrada pelo OP parece muito mais com paralelismo do que com sincronia (se é uma palavra ...). asynch vs synch é sobre quando a ação é iniciada (agora quando eu chamo, ou mais tarde quando o agendador decide), enquanto paralelo significa "sim, eles estão acontecendo ao mesmo tempo" vs seqüencial.
Giacomo Alzetta

1
@GiacomoAlzetta Acho que a palavra é sincronismo. Também encontrei estas palavras semelhantes: sincronização, sincronia e sincronicidade. Provavelmente vale a sua própria pergunta.
Theraot

12

Assíncrono: não existe ou ocorre ao mesmo tempo.

Síncrono: existente ou ocorrendo ao mesmo tempo.

O atributo async significa que o script será executado assim que for baixado, mesmo se o html ainda estiver analisando, o que significa que os dois processos existem ao mesmo tempo para mim.

Isso é realmente confuso!

Considere, em vez disso, os significados de sincronizado e não sincronizado . Duas coisas são sincronizadas se o tempo de um depende do outro e não são sincronizadas se o tempo não estiver relacionado.

No seu exemplo de fluxo de trabalho assíncrono, temos duas coisas acontecendo: execução de script e análise de html. Essas duas coisas não são sincronizadas ; o tempo da operação de execução e o tempo da operação de análise não dependem um do outro. Se tornássemos o fluxo de trabalho síncrono , as operações seriam sincronizadas . Digamos, a execução não começa até que a análise termine definitivamente.

Mas é importante perceber que, na verdade, existem três possibilidades aqui:

  • execução e análise são verdadeiramente não sincronizadas; eles podem acontecer a qualquer momento e em qualquer ordem, o que for mais eficiente.
  • execução e análise são sincronizadas; digamos, a CPU não faz nada enquanto aguarda a conclusão da E / S.
  • a execução e a análise são sincronizadas, mas enquanto aguardamos a conclusão da E / S, a CPU tem permissão para fazer outro trabalho e, em seguida, voltar e fazer a análise após a conclusão do download .

Depois de entender isso, o objetivo dos fluxos de trabalho assíncronos nas linguagens de programação populares fica mais claro:

  • Os fluxos de trabalho assíncronos nos ajudam a implementar operações de alta latência com eficiência, porque não somos obrigados a solicitar coisas não relacionadas no tempo. Se a análise é de alta latência e limite de E / S, e a execução de script é de alta latência e limite de CPU, podemos obter uma vitória dessincronizando total ou parcialmente essas operações.

  • O awaitoperador em idiomas como C # é a operação de pedidos em fluxos de trabalho assíncronos. Uma espera é uma espera assíncrona ; é um ponto em que expressam uma relação de pedidos entre duas partes de um fluxo de trabalho assíncrono, e dizer que não é um "acontece antes" relação entre o código antes da await eo código após o aguardam. É assim que implementamos a terceira opção .

Se tudo isso for abstrato demais, pense em alguns exemplos do mundo real. Quando você envia uma carta - uma operação de E / S de alta latência - ainda é possível fazer um trabalho intensivo da CPU - tarefas de matemática, por exemplo - enquanto aguarda a resposta da carta. As operações de fazer sua lição de matemática e ler seu e-mail não são sincronizadas.

Mas suponha que agora você envie uma carta e a resposta contenha um número necessário para efetuar seus impostos. Agora você não pode fazer o trabalho da CPU - calculando seus impostos - até que a operação de E / S seja concluída. Mas você ainda pode cortar a grama enquanto espera . Esse é um fluxo de trabalho assíncrono que expressou uma relação de tempo entre suas partes.


6

Sou engenheiro eletricista e lidamos com síncrona vs assíncrona em circuitos lógicos (portas lógicas).

Digamos que você tenha um portão AND (ou qualquer portão), que tenha duas entradas e uma saída.

Se for assíncrono, ele atualizará sua saída no momento em que alguma das entradas for alterada, de forma que a saída seja alterada. Foi assim que seu exemplo funcionou - o programa que você mencionou.

No entanto, se esse portão também tiver um relógio (por exemplo, uma onda quadrada de 1 segundo) anexado a ele, onde ele será atualizado na batida de cada segundo, conforme a onda quadrada vai de baixa a alta, é síncrona. Está vinculado à frequência do relógio. Portanto, é síncrono. Você poderia conectar esse relógio a muitos circuitos, e eles funcionariam em ritmo um com o outro - sincronizados. Se o seu programa apenas verificar se foi lido para ser executado a cada segundo, ele também será sincronizado.


1
Como porta serial assíncrona / síncrona.
jiwopene

2

Imagine dois satélites orbitando a Terra.

  • O satélite A possui um período de rotação em torno da Terra, de modo que, para cada rotação completa do planeta, o satélite percorre a Terra mais ou menos que uma vez .
  • O satélite B tem um período de rotação em torno da Terra, de modo que, para cada rotação completa do planeta, o satélite percorre a Terra exatamente uma vez .

O satélite B no exemplo acima está em órbita geossíncrona, conforme definido por

tendo um período de rotação síncrono com o da rotação da Terra.

Não se argumenta que o satélite A seja geossíncrono simplesmente porque "existe ou ocorre [s] ao mesmo tempo" que o planeta. De fato, o próprio satélite B também não é relevante - o que é relevante é o período de rotação sincronizado com o período de rotação com o da Terra. Não se trata da existência simultânea dos objetos; é sobre o relacionamento entre os objetos. Segure esse pensamento.

Suponha que eu diga que dois threads em um sistema estão sendo executados ao mesmo tempo. O segmento A (TA) está buscando dados para o Processo A e o segmento B (TB) está buscando dados para o Processo B. Pergunto: "TA e TB são assíncronos?". Sua resposta seria: "Como eu poderia saber? Eu teria que ver o código que os invocou em seus respectivos processos". Ao que eu replicaria na minha tentativa de ser complicado, "Mas estou lhe dizendo que a AT e a TB estão definitivamente funcionando ao mesmo tempo".

E você, sendo bastante o indivíduo inteligente, responderia: "Mais uma vez - eles podem estar em execução ao mesmo tempo , mas eu não tenho idéia se eles estão funcionando de forma assíncrona com relação a seus respectivos processos que os invocados TA e TB em execução de forma assíncrona para. O outro realmente faz não faz sentido porque eles não foram gerados pelo mesmo processo ".

Então, a essa altura, deveríamos estar ganhando alguma intuição de que a existência de um relacionamento é o que é relevante aqui, não apenas a existência desses dois fios. Quando um método é executado de forma assíncrona, o que estamos dizendo é que a execução desse método " NÃO precisa existir ou ocorrer ao mesmo tempo" que a execução do método que o invocou. Veja o seguinte exemplo:

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

De nossa discussão sobre satélites anteriores, "não se trata da existência simultânea dos objetos; trata-se da relação entre os objetos". Não se trata da existência de um método de chamada e o método de chamada; trata-se da existência de um relacionamento entre a execução do invocador e a execução do invocado. Se olharmos para os encadeamentos do sistema e descobrimos que DoThatAsync()foi chamado, mas não estava em execução, talvez ele esteja aguardando o planejador ou alguma outra E / S, isso não significa necessariamente que o método de chamada Invoker()não esteja em execução - há trabalho possível fazendo. Claro, pode ser no ponto de awaiting DoThatAsync(), mas isso não é garantido. Isso não é verdade para as outras funções depois que elas são invocadas - se elas pararem,Invoker()pára - não importa o quê. Isso é garantido. A execução entre o Invoker()método síncrono invocado e "existe ou ocorre ao mesmo tempo".


Eu gosto disso na verdade. Em geral, é o oeste selvagem da execução arbitrária como "assíncrona" vs. um caminho claro de execução definido como "síncrona"
Cruncher

Eu também acho que esta é a melhor resposta.
Barmar 28/08

2

Exemplos concretos

Gostaria de adicionar alguns exemplos do mundo real e conectá-los ao mundo da engenharia de software. Primeiro, considere algo que, espero, corresponda à sua definição intuitiva de "síncrona": o piscar de vaga-lumes , sob algumas circunstâncias. Segundo, considere a corrida olímpica feminina de revezamento 4x100 . Terceiro, considere o velho argumento dos filmes militares: "Homens, sincronizem seus relógios!"

Agora, vamos pensar no que está acontecendo. Vamos começar observando que todas essas coisas são processos ou entidades prolongadas no tempo . Não faz sentido dizer que uma tigela é "síncrona" e a rocha é "assíncrona". Segundo, são necessários dois para dançar o tango . Você não pode dizer que "um corredor é sincronizado". Sincronizar com o que? Finalmente, para que dois processos façam algo ao mesmo tempo, a menos que eles já tenham exatamente a mesma frequência e fase, um ou os dois devem esperar .

Análise

Quando a definição do dicionário diz que duas entidades sincronizadas "ocorrem ou existem ao mesmo tempo", isso se alinha muito bem ao conceito de luz dos vaga-lumes. Infelizmente, dizer que a luz está "sincronizada" é uma maneira desleixada de dizer que os processos de iluminação do vaga - lume estão sincronizados.

Então, como um grupo de vaga-lumes, que presumivelmente não têm o Apple SmartWatch e o NTP para guiá-los, conseguem piscar as extremidades traseiras ao mesmo tempo? Bem, é muito fácil se eles tiverem meios para definir um ritmo consistente e puderem fazer pequenos ajustes. Eles apenas piscam e, se mais pessoas piscam logo após eles, diminuem a velocidade (aumentam o atraso), enquanto que se mais piscam logo antes deles, eles aceleram (diminuem o atraso). Assim, eles podem usar um processo simples de feedback para chegar essencialmente ao mesmo ritmo e fase. A observação importante aqui é notar que eles alcançam a sincronia, aguardando o momento certo para piscar .

A corrida 4x100 é interessante porque você vê as duas formas de sincronismo de processos em ação: os corredores dentro de uma equipe são sincronizados, enquanto os corredores em diferentes equipes são "assíncrono". O segundo corredor no relé deve esperar até que o primeiro corredor entre na zona de transferência . A entrega é um evento síncrono entre esses dois corredores. No entanto, os corredores de diferentes faixas não se importam com o que está acontecendo em outra faixa e, certamente, não diminuem a velocidade e fazem as transferências em sincronia. Cada faixa de corredores é assíncrona entre si. Novamente, vemos que a sincronização implica em espera, enquanto a assincronia não.

Por fim, os soldados de uma empresa (pelotão, equipe de bombeiros etc.) devem sincronizar seus relógios para que possam atacar o inimigo ao mesmo tempo . Pode ser que alguns soldados cheguem a suas posições antes de outros, ou tenham a oportunidade de disparar contra o inimigo antes. Mas um ataque simultâneo é geralmente mais eficaz do que um ataque aleatório por causa do elemento surpresa. Portanto, para alcançar a sincronia, muitos soldados precisam esperar o tempo determinado para agir.

Característica definidora

Por que essa ênfase na espera? Bem, é porque a espera é a característica que define os processos síncronos e assíncronos. Se você possui dois processos sobre os quais não conhece nada, deve, por padrão, assumir que eles são assíncronos. Por exemplo, uma entrega de pacotes e uma ambulância provavelmente não estão sincronizadas. Para demonstrar que dois processos são, de fato, sincronizados, você precisa encontrar um momento muito especial no tempo: o ponto de sincronização .

Um motorista de entrega que entrega um pacote e uma ambulância que leva alguém para o hospital geralmente não compartilham pontos no tempo que identificamos como um "ponto de sincronização". Por outro lado, os vaga-lumes piscando em uníssono têm um ponto de sincronização toda vez que piscam, os corredores de revezamento têm um ponto de sincronização toda vez que entregam o bastão, e os soldados têm um ponto de sincronização quando lançam seu ataque. Se você conseguir identificar um ou mais pontos de sincronização, os processos serão sincronizados . Isso deve ser fácil de entender, porque "syn-" é um prefixo grego que significa "com" ou "juntos" e "crono" é a raiz grega de "tempo". "Sincronizado" significa literalmente "ao mesmo tempo",

Limites

Observe que a "sincronização" não se aplica necessariamente a toda a vida útil de um ou de ambos os processos. Eu argumentaria que isso se aplica apenas ao "tempo de espera até o (s) ponto (s) de sincronização". Assim, dois processos podem operar de forma assíncrona até atingirem um estado em que precisam se comunicar, depois se tornam sincronizados, trocam informações e depois continuam de forma assíncrona. Um exemplo simples é conhecer alguém para tomar um café. Obviamente, a reunião é um ponto de sincronização (ou mais), e o fato de duas pessoas chegarem nesse ponto demonstra a sincronia. No entanto, não diríamos que, porque duas pessoas se encontraram para tomar café, essas duas vidas humanassão "sincronizados". Pode ser que esse foi o único instante em suas vidas que eles se conheceram, e tudo o mais que eles fazem é independente.

Também não é o caso de encontros incidentais demonstrarem sincronia. Se dois estranhos se cruzam na rua, o fato de estarem em um determinado lugar em algum momento não prova sincronia. Tampouco o fato de uma pessoa estar sentada em um banco esperando o ônibus e outra passar por ali. Os processos são síncronos apenas quando se encontram para um propósito .

Conexão de Software

Agora, vamos pensar em uma tarefa muito fundamental no software: ler de um arquivo. Como você provavelmente sabe, o armazenamento em massa geralmente é milhares a milhões de vezes mais lento que o cache ou a memória principal. Por esse motivo, os sistemas operacionais e as bibliotecas de linguagens de programação geralmente oferecem operações de E / S síncronas e assíncronas. Agora, mesmo que seu programa tenha apenas um único encadeamento, você deve pensar no sistema operacional como um "processo separado" para os fins desta discussão.

Sincronizar

Quando você faz uma "leitura de E / S síncrona", seu encadeamento deve esperar até que os dados estejam disponíveis; nesse ponto, eles continuam. Isso é muito parecido com um corredor de revezamento entregando o bastão para o próximo corredor, mas imagine um revezamento com apenas dois corredores percorrendo toda a pista, e o segundo corredor também volta para o primeiro.

Nesse caso, o encadeamento do programa e o processo de E / S do SO não estão "acontecendo (atuando) ao mesmo tempo" e, portanto, parece estranho dizer que esses processos estão "sincronizados". Mas essa é a maneira errada de ver! É como dizer: "Os corredores de uma equipe de revezamento não estão correndo ao mesmo tempo, portanto não estão sincronizados". De fato, ambas as afirmações estão erradas! Os corredores em uma equipe de revezamento fazer e devem ser executados ao mesmo tempo, mas apenas em um momento muito específico: a mão-off do bastão. De fato, é apenas esse momento especial durante a corrida que nos convence de que as equipes de revezamento são sincronizadas para começar! Se visualizarmos a solicitação e resposta de E / S como "o bastão",

Por outro lado, se pensarmos em algo como Análise de Elementos Finitos em um supercomputador, veremos que milhares de processos devem trabalhar em etapas para atualizar um enorme estado global. Mesmo que alguns dos nós concluam seu trabalho por um determinado intervalo de tempo antes de outros, todos precisam aguardar o término do tempo, pois os resultados se propagam para os vizinhos pelo espaço. Esse tipo de sincronização é como os vaga-lumes: todos os atores estão realizando o mesmo tipo de tarefa.

Variedade do processo

Por esse motivo, podemos inventar alguns termos para nos ajudar a ver que existem três tipos de coisas acontecendo: "sincronia homogênea", "sincronia heterogênea" e "sincronia sequencial". Portanto, quando os atores estão realizando a mesma tarefa simultaneamente (FEA, vaga-lume), eles são "homogêneos". Quando eles estão executando tarefas diferentes simultaneamente (soldados correndo vs. rastejando vs. nadando para seus destinos, física vs. som vs. threads de IA em um jogo), eles são "heterogêneos". Quando eles estão executando tarefas uma por vez, são "sequenciais" (corredores de retransmissão, bloqueio de E / S). Eles podem parecer muito diferentes, mas compartilham uma propriedade essencial: todos os tipos de atores esperam um pouco para garantir que todos cheguem ao ponto de sincronização ao mesmo tempo. entre os pontos de sincronização, ou "executar a mesma ação" é irrelevante para a propriedade da sincronicidade.

Os pipelines de renderização em uma GPU são síncronos porque todos devem terminar o quadro juntos e iniciar um novo quadro juntos. Eles são homogêneos porque estão fazendo o mesmo tipo de trabalho e são todos ativos juntos. Mas o loop principal do jogo de um servidor e os threads de E / S de bloqueio que processam a entrada remota são heterogêneos porque eles fazem tipos muito diferentes de trabalho, e alguns dos threads de E / S não farão nada, porque nem todos as conexões são usadas. Mesmo assim, eles são sincronizados, porque precisam compartilhar o estado atomicamente (um jogador não deve ver uma atualização parcial do mundo do jogo, nem o servidor deve ver apenas um fragmento da entrada do jogador).

Assíncrono

Agora, vamos considerar uma "leitura assíncrona de E / S". Quando seu programa envia uma solicitação ao sistema operacional para ler um pouco de dados do armazenamento, a chamada retorna imediatamente . Vamos ignorar retornos de chamada e focar na pesquisa. Em geral, o momento em que os dados estão disponíveis para o seu programa não corresponde a nenhum momento especial no que diz respeito ao encadeamento do programa. Se o seu programa não estiver explicitamente aguardando os dados, o encadeamento nem saberá exatamente quando esse momento ocorrerá. Ele descobrirá apenas que os dados estão aguardando na próxima vez em que forem verificados.

Não há horário de reunião especial em que o SO e o encadeamento do programa concordam em entregar os dados. Eles são como dois navios passando na noite. A assincronia é caracterizada por essa ausência de espera. Obviamente, o encadeamento do programa geralmente acaba aguardando a operação de E / S, mas não precisa. Felizmente, ele pode continuar fazendo outros cálculos enquanto a busca de E / S está ocorrendo e verificar apenas mais tarde quando houver um momento de sobra. Obviamente, quando o sistema operacional busca os dados, ele também não fica esperando. Ele coloca os dados em algum lugar conveniente e continua seus negócios. Nesse caso, é como se o programa entregasse o bastão ao sistema operacional, e o sistema operacional aparecesse mais tarde, largasse o bastão no chão junto com os dados e saísse da pista. O programa pode ou não estar esperando para receber a transferência.

Paralelismo

Quando marcamos uma função como "assíncrona" no software, geralmente significa que queremos paralelismo . Mas lembre-se de que o paralelismo não implica sincronia . Os vaga-lumes são um bom exemplo, porque também exibem comportamento síncrono e assíncrono. Enquanto a maioria das moscas brilhava em uníssono, muitas estavam obviamente fora de sintonia com o resto do grupo e brilhavam mais aleatoriamente. As moscas podem estar agindo simultaneamente , mas nem todas foram sincronizadas .

Agora, quando marcamos algum código como "assíncrono", parece engraçado, porque implica que o restante do código não tão marcado é "sincronização". Afinal, o que isso quer dizer? Não insistimos que a "sincronização" exigia dois para dançar? Mas e se estivermos falando sobre a execução de código em um único thread? Nesse caso, precisamos dar um passo atrás e pensar em um programa como uma sequência de estados e transições entre esses estados. Uma declaração em um programa causa uma transição de estado. Podemos pensar nisso como um "micro-processo" que começa e termina com a declaração. Os pontos de sequência definidos pelo idioma são, de fato, os pontos de sincronização desses "microprocessos". E, assim, podemos ver um thread único,

A integridade da linguagem de programação garante que as atualizações de estado não interfiram nas instruções e os pontos de sequência definem limites através dos quais o compilador não tem permissão para fazer otimizações observáveis. Por exemplo, a ordem de avaliação das expressões em uma instrução pode ser indefinida ou subespecificada, dando ao compilador a liberdade de otimizar a instrução de várias maneiras. Mas quando a próxima instrução começar, o programa deverá estar em um estado bem definido, se o próprio PL estiver correto.

Até agora, deve ficar claro o que queremos dizer com "assíncrono". Isso significa exatamente que o contrato implícito de sincronia dentro de um bloco de código está isento para o bloco assíncrono. É permitido atualizar o estado do programa independentemente, sem as garantias de segurança normalmente implícitas no modelo de computação seqüencial (consistentemente consistente, síncrono). Obviamente, isso significa que precisamos tomar cuidado especial para não destruir o estado do programa com inconsistência. Isso geralmente significa que introduzimos sincronia limitada e explícita para coordenar com o bloco assíncrono. Observe que isso significa que o bloco assíncrono pode ser assíncrono e síncrono em momentos diferentes! Mas lembrando que a sincronização indica meramente a existência de um ponto de sincronização, não devemos ter problemas em aceitar essa noção.


Você pode remover todos os seus exemplos aqui, exceto a corrida de revezamento (que ilustra claramente as noções de software de sincronia e assincronia, enquanto os outros não), e sua resposta melhoraria significativamente.
Robert Harvey

Acho que os outros exemplos demonstram ação simultânea versus ação heterogênea, que acredito causou grande parte da confusão do OP.
Lawnmower Man

1

Uma maneira de pensar sobre isso são as instruções SIMD , como o AVX . Aqui estão alguns exemplos de como eles são usados.

As instruções SIMD síncronas permitem que você faça vários cálculos exatamente ao mesmo tempo , no mesmo encadeamento, operando uma única instrução sobre vários dados.

Enquanto o multithreading assíncrono permite que você faça vários cálculos em horários "provavelmente" "um tanto" "semelhantes".

Combine isso com as seguintes definições:

adjetivo síncrono syn · chro · nous | \ ˈSiŋ-krə-nəs, insin-

1: acontecendo, existindo ou surgindo exatamente ao mesmo tempo [grifo meu]

adjetivo assíncrono asyn · chro · nous | \ (ˌ)--ŋsiŋ-krə-nəs, -ˈsin- \

1: [...]: não síncrono


1

Uma analogia que me fez entender a diferença entre Sync vs Async vs Multi-threaded é a de uma cozinheira na cozinha.

Imagine que você está fazendo macarrão. Você tem três etapas:

  1. Ferva e escorra o macarrão
  2. Prepare o molho
  3. Combine macarrão e molho

Método síncrono. No cenário síncrono, há apenas uma pessoa (thread) fazendo todo o trabalho em sequência. Primeiro você ferve o macarrão e fica parado observando-o ferver. Então você escorra e reserve. Então você prepara o molho. Quando o molho estiver pronto, pegue a massa, misture com o molho e seu prato estará pronto. O problema aqui é ineficiente. Como você trabalhava sequencialmente de maneira síncrona, não podia trabalhar o molho enquanto a massa estava fervendo. Então, isso fez você perder tempo, e sua massa esfriou enquanto o molho estava sendo preparado.

Método assíncrono. Nesse cenário, ainda há apenas um cozinheiro (linha), mas enquanto a massa está fervendo, você faz o molho. Quando a massa é cozida, você called-backprepara o molho para escorrê-lo e depois called-backtermina o molho novamente. Isso é mais eficiente agora, porque você economizou tempo e sua massa não precisou esperar muito tempo pelo molho.

Método multiencadeado. Agora, imagine que você contrata um novo cozinheiro. Agora você tem dois cozinheiros (threads). Enquanto um cozinheiro faz macarrão, o segundo faz molho. É necessário neste cenário? Não, porque fazer macarrão é simples o suficiente para ser eficiente com o método assíncrono. E, gerenciar vários cozinheiros é uma sobrecarga adicional. Mas se você estava fazendo um prato mais complicado ou mais pratos ao mesmo tempo, vários cozinheiros são úteis.


Esta é realmente uma boa analogia.
Robert Harvey

0

Uma boa pergunta e termos que são frequentemente usados ​​de maneiras diferentes que levam à confusão.

Minha resposta é que esses termos são relativos - e o que eles são em relação ao principal programa que está sendo executado (ou às vezes em um thread).

Esses termos especificam algo sobre a operação interna e o tempo de um programa, sobre se as mensagens são enviadas ou recebidas de maneira bloqueadora (sincronização) ou não bloqueadora (assíncrona). Se um encadeamento (principal) for bloqueado pelo envio ou recebimento, isso é "sincronização" e se é interrompível de alguma forma, é "assíncrono". Para reiterar, esses termos são sobre implementações que funcionam (regularmente), bem como manipulam eventos.

(IMHO, é claro) uma vez que uma mensagem está sendo transmitida, não existe sincronização vs. assíncrona. Nas mensagens, há um remetente e um destinatário, cada um deles pode ter uma implementação de sincronização ou assíncrona independente da outra - mas uma vez que uma mensagem está no ar, é apenas uma mensagem, não é mais sincronizada ou assíncrona. Podemos classificar uma mensagem como solicitação ou resposta ou mensagem unidirecional, mas isso é ortogonal para sincronização e assíncrona (que se refere ao fato de a implementação estar bloqueando a espera ou pode ser interrompida de alguma forma).


Não-bloqueio é distinto de assíncrono,
user207421 28/08

1
@ user207421 por favor elabore, porque eu os chamaria de sinônimos nesse contexto
Jacob Raihle 28/08

0

"síncrono" significa que dois eventos ocorrem ao mesmo tempo - mas quais eventos?

Quando dizemos "execução síncrona", queremos dizer que o chamador e o destinatário estão executando (ou seja, na pilha) ao mesmo tempo. Esse é provavelmente o significado que você procura.

Quando dizemos "porta lógica síncrona", queremos dizer que a porta lógica está sincronizada com o relógio da CPU.

Quando dizemos "modelo síncrono" no contexto de sistemas distribuídos, queremos dizer que todos os nós executam seus programas na etapa de bloqueio, e as mensagens enviadas na etapa n são garantidas para chegar ao início da etapa n + 1.

Quando o Java Language Specification diz que um encadeamento "sincroniza" com outro, isso significa que as ações nos encadeamentos diferentes ocorrem "ao mesmo tempo" (com relação ao que acontece antes do relacionamento). E quando dizem que dois threads "sincronizam o acesso a um objeto", na verdade eles significam que os threads são sincronizados entre si para garantir que nunca funcionem no objeto ao mesmo tempo.

... e tenho certeza de que você poderia aplicar a palavra em ainda mais contextos, porque "as coisas acontecem ao mesmo tempo" é uma idéia bastante genérica :-)


0

Penso que a chave da sua confusão pode ser resumida por:

O atributo async significa que o script será executado assim que for baixado, mesmo se o html ainda estiver analisando

O que deve ser percebido é que essa sentença não faz sentido porque descreve uma situação impossível. Se o HTML ainda estiver analisando, o processo de download do script nem começará se for assíncrono.

Na programação, meios síncronos:

Todos os dados em que você está interessado já existem na memória no momento em que você está executando sua lógica

Enquanto assíncrono significa:

Alguns dos dados nos quais você está interessado ainda não existem e existem apenas em algum momento no futuro

De fato, é esse aspecto não presente da programação assíncrona que geralmente confunde as pessoas.

Como os scripts são normalmente carregados é que a análise de html é pausada; o script é baixado; quando o download do script é concluído, ele é executado e, em seguida, a análise de html continua. A análise de html e a execução do script ocorrem no "mesmo" tempo (o mesmo tempo significa juntos, não simultâneos).

Como os asyncscripts são carregados, o html vê a tag de script e depois se lembra de fazer o download do script no futuro, mas continua analisando. A análise de html não está em pausa para o download do script. Posteriormente , após a análise html, todos os scripts assíncronos são baixados e executados. A análise de html e a execução do script não acontecem ao mesmo tempo (novamente, o mesmo tempo significa juntos, nesse caso, são executados separadamente).

Então, para resumir:

  • Os scripts síncronos são analisados ​​juntamente com o html.

  • Scripts assíncronos são analisados ​​separadamente no futuro.

Portanto, a definição da asyncpropriedade não é que o script seja executado assim que for baixado - isso é verdade para scripts síncronos e assíncronos. A definição de async é que a análise de html não espera o download do script .

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.