Quelle est la différence entre une exécution asynchrone et synchrone?
Quelle est la différence entre une exécution asynchrone et synchrone?
Réponses:
Lorsque vous exécutez quelque chose de manière synchrone, vous attendez qu'il se termine avant de passer à une autre tâche. Lorsque vous exécutez quelque chose de manière asynchrone, vous pouvez passer à une autre tâche avant qu'elle ne se termine.
Cela étant dit, dans le contexte des ordinateurs, cela se traduit par l'exécution d'un processus ou d'une tâche sur un autre «thread». Un thread est une série de commandes (un bloc de code) qui existe comme unité de travail. Le système d'exploitation peut gérer plusieurs threads et affecter à un thread un morceau ("tranche") de temps processeur avant de passer à un autre thread pour lui donner un tour pour faire un peu de travail. À la base (pardonnez le jeu de mots), un processeur peut simplement exécuter une commande, il n'a aucun concept de faire deux choses à la fois. Le système d'exploitation simule cela en allouant des tranches de temps à différents threads.
Maintenant, si vous introduisez plusieurs cœurs / processeurs dans le mixage, alors les choses PEUVENT réellement se produire en même temps. Le système d'exploitation peut allouer du temps à un thread sur le premier processeur, puis allouer le même bloc de temps à un autre thread sur un processeur différent. Tout cela consiste à permettre au système d'exploitation de gérer l'achèvement de votre tâche pendant que vous pouvez continuer dans votre code et faire d'autres choses.
La programmation asynchrone est un sujet compliqué en raison de la sémantique de la façon dont les choses se lient lorsque vous pouvez les faire en même temps. Il existe de nombreux articles et livres sur le sujet; regarde!
Synchrone / Asynchrone N'A RIEN À FAIRE AVEC LE MULTI-FILAGE.
Synchrone ou Synchronisé signifie "connecté" ou "dépendant" d'une certaine manière. En d'autres termes, deux tâches synchrones doivent être conscientes l'une de l'autre et une tâche doit s'exécuter d'une manière qui dépend de l'autre, comme attendre le démarrage jusqu'à ce que l'autre tâche soit terminée.
Asynchrone signifie qu'ils sont totalement indépendants et que ni l'un ni l'autre ne doit considérer l'autre de quelque façon que ce soit lors de l'initiation ou de l'exécution.
Synchrone (un fil):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Synchrone (multi-thread):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Asynchrone (un thread):
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-->|
Asynchrone (multi-thread):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
caractères.|
Techniquement, le concept de synchrone / asynchrone n'a vraiment rien à voir avec les threads . Bien que, en général, il soit inhabituel de trouver des tâches asynchrones s'exécutant sur le même thread, il est possible, (voir ci-dessous pour des exemples) et il est courant de trouver deux ou plusieurs tâches s'exécutant de manière synchrone sur des threads séparés ... Non, le concept de synchrone / asynchrone a uniquement à voir avec le fait de savoir si une deuxième tâche ou une tâche ultérieure peut être lancée avant la fin de l'autre (première) tâche, ou si elle doit attendre. C'est tout. Quel thread (ou threads), ou processus, ou CPU, ou en effet, sur quel matériel, la ou les tâches sont exécutées n'est pas pertinent. En effet, pour faire ce point, j'ai édité les graphiques pour le montrer.
EXEMPLE ASYNCHRONE:
Pour résoudre de nombreux problèmes d'ingénierie, le logiciel est conçu pour diviser le problème global en plusieurs tâches individuelles, puis les exécuter de manière asynchrone. L'inversion d'une matrice ou un problème d'analyse par éléments finis sont de bons exemples. En informatique, le tri d'une liste en est un exemple. La routine de tri rapide, par exemple, divise la liste en deux listes et effectue un tri rapide sur chacune d'elles, en s'appelant (tri rapide) de manière récursive. Dans les deux exemples ci-dessus, les deux tâches peuvent (et ont souvent été) exécutées de manière asynchrone. Ils n'ont pas besoin d'être sur des threads séparés. Même une machine avec un processeur et un seul thread d'exécution peut être codée pour lancer le traitement d'une deuxième tâche avant la fin de la première. Le seul critère est que les résultats d'une tâche ne sont pas nécessaires en tant qu'entrées dans l'autre tâche. Tant que les heures de début et de fin des tâches se chevauchent (possible uniquement si la sortie de l'une ou l'autre n'est pas nécessaire comme entrées pour l'autre), elles sont exécutées de manière asynchrone, quel que soit le nombre de threads utilisés.
EXEMPLE SYNCHRONE:
Tout processus composé de plusieurs tâches où les tâches doivent être exécutées en séquence, mais une doit être exécutée sur une autre machine (extraire et / ou mettre à jour les données, obtenir une cotation boursière du service financier, etc.). Si c'est sur une machine distincte, c'est sur un thread séparé, qu'il soit synchrone ou asynchrone.
En termes plus simples:
SYNCHRONE
Vous êtes dans une file d'attente pour obtenir un billet de cinéma. Vous ne pouvez pas en obtenir un avant que tout le monde devant vous n'en reçoive un, et il en va de même pour les personnes en attente derrière vous.
ASYNCHRONE
Vous êtes dans un restaurant avec beaucoup d'autres personnes. Vous commandez votre nourriture. D'autres personnes peuvent également commander leur nourriture, elles n'ont pas à attendre que votre nourriture soit cuite et servie avant de pouvoir commander. Dans la cuisine, les employés du restaurant cuisinent, servent et prennent des commandes en continu. Les gens recevront leur nourriture dès qu'elle sera cuite.
Exécution synchrone
Mon patron est un homme occupé. Il me dit d'écrire le code. Je lui dis: très bien. Je commence et il me regarde comme un vautour, debout derrière moi, sur mon épaule. Je suis comme "Mec, WTF: pourquoi tu ne vas pas faire quelque chose pendant que je termine ça?"
il est comme: "Non, j'attends ici jusqu'à ce que vous ayez fini." C'est synchrone.
Exécution asynchrone
Le patron me dit de le faire, et plutôt que d'attendre mon travail, le patron s'en va et fait d'autres tâches. Lorsque je termine mon travail, je fais simplement rapport à mon patron et je dis: "Je suis FAIT!" Il s'agit de l'exécution asynchrone.
(Suivez mon conseil: ne travaillez JAMAIS avec le patron derrière vous.)
L'exécution synchrone signifie que l'exécution se produit dans une seule série. A->B->C->D
. Si vous appelez ces routines, A
s'exécutera, puis se terminera, puis B
commencera, puis se terminera, puis C
commencera, etc.
Avec l' exécution asynchrone , vous commencez une routine et la laissez s'exécuter en arrière-plan pendant que vous démarrez la suivante, puis à un moment donné, dites «attendez que cela se termine». C'est plus comme:
Début d' A->B->C->D->
attente pour A
à la fin
L'avantage est que vous pouvez exécuter B
, C
et ou D
pendant qu'il A
est toujours en cours d'exécution (en arrière-plan, sur un thread séparé), de sorte que vous puissiez mieux tirer parti de vos ressources et avoir moins de «blocages» ou «temps d'attente».
En résumé, la synchronisation fait référence aux points de début et de fin de deux ou plusieurs processus , PAS à leurs exécutions . Dans cet exemple, le point de terminaison du processus A est synchronisé avec le point de départ du processus B:
SYNCHRONE | -------- A -------- | | -------- B -------- |
Les processus asynchrones, en revanche, n'ont pas leurs points de départ et d'extrémité synchronisés:
ASYNCHRONE | -------- A -------- | | -------- B -------- |
Lorsque le processus A chevauche le processus B, ils s'exécutent simultanément ou de manière synchrone (définition de dictionnaire), d'où la confusion.
MISE À JOUR: Charles Bretana a amélioré sa réponse , donc cette réponse est maintenant juste un simple mnémonique (potentiellement simplifié).
Synchrone signifie que l'appelant attend la réponse ou l'achèvement, asynchrone que l'appelant continue et qu'une réponse arrive plus tard (le cas échéant).
Par exemple:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Cela produira toujours:
Before call
In call
After call
Mais si nous devions faire doSomething asynchrone (plusieurs façons de le faire), la sortie pourrait devenir:
Before call
After call
In call
Parce que la méthode effectuant l'appel asynchrone continuerait immédiatement avec la ligne de code suivante. Je dis "pourrait", car l'ordre d'exécution ne peut pas être garanti avec des opérations asynchrones. Il pourrait également s'exécuter comme l'original, en fonction de la synchronisation des threads, etc.
Je pense que c'est une explication un peu ronde, mais cela clarifie toujours en utilisant un exemple réel.
Petit exemple:
Disons que la lecture d'un audio implique trois étapes:
Si votre lecteur audio effectue les étapes 1, 2, 3 séquentiellement pour chaque morceau, il est alors synchrone. Vous devrez attendre un certain temps pour entendre la chanson jusqu'à ce que la chanson soit récupérée et décompressée.
Si votre lecteur audio effectue les étapes 1, 2, 3 indépendamment les uns des autres, il est alors asynchrone. c'est à dire. Lors de la lecture de l'audio 1 (étape 3), s'il extrait l'audio 3 du disque dur en parallèle (étape 1) et qu'il décompresse l'audio 2 en parallèle. (étape 2) Vous finirez par entendre la chanson sans attendre beaucoup pour aller chercher et décompresser.
Les opérations de synchronisation et asynchrones concernent l'ordre d'exécution d'une nouvelle tâche par rapport à la tâche actuelle. Deux tâches sur une table: la tâche actuelle et une nouvelle tâche
Synchrone (blocage) - implique que les tâches seront exécutées une par une. Une tâche suivante n'est démarrée qu'après la fin de sa tâche précédente. Task 2
n'est pas démarré avant la Task 1
fin
Asynchrone (non bloquant) - implique que la tâche retourne le contrôle immédiatement avec la promesse d'exécuter un code et de notifier le résultat plus tard (par exemple rappel, fonctionnalité). Task 2
est exécuté même s'il Task 1
n'est pas terminé
SO réponse à propos de la synchronisation et de l'async: dans iOS , dans Android
Simplement dit, l'exécution asynchrone fait des choses en arrière-plan.
Par exemple, si vous souhaitez télécharger un fichier sur Internet, vous pouvez utiliser une fonction synchrone pour le faire, mais cela bloquera votre thread jusqu'à ce que le fichier soit téléchargé. Cela peut rendre votre application insensible à toute entrée utilisateur.
Au lieu de cela, vous pouvez télécharger le fichier en arrière-plan à l'aide de la méthode asynchrone. Dans ce cas, la fonction de téléchargement revient immédiatement et l'exécution du programme se poursuit normalement. Toutes les opérations de téléchargement sont effectuées en arrière-plan et votre programme sera averti lorsqu'il sera terminé.
Comme exemple très simple,
SYNCHRONE
Imaginez 3 élèves de l'école chargés de courir une course de relais sur une route.
Le 1er élève parcourt sa distance donnée, s'arrête et passe le relais au 2e. Personne d'autre n'a commencé à courir.
1------>
2.
3.
Lorsque la 2e élève récupère le bâton, elle commence à courir la distance qui lui est donnée.
1.
2------>
3.
La 2e étudiante a détaché son lacet. Maintenant, elle s'est arrêtée et s'est à nouveau ligotée. Pour cette raison, l'heure de fin du 2e s'est allongée et l'heure de début du 3e a été retardée.
1.
--2.--->
3.
Ce schéma se poursuit jusqu'à ce que le 3e récupère le bâton du 2e et termine la course.
ASYNCHRONE
Imaginez seulement 10 personnes au hasard marchant sur la même route. Ils ne sont pas sur une file d'attente bien sûr, marchant simplement au hasard sur différents endroits sur la route à des rythmes différents.
Le lacet de la 2e personne s'est détaché. Elle s'est arrêtée pour la refermer.
Mais personne n'attend qu'elle soit attachée. Tous les autres marchent toujours de la même façon qu'avant, à ce rythme.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
J'ai créé un gif pour expliquer cela, j'espère être utile: regardez, la ligne 3 est asynchrone et les autres sont synchrones. toutes les lignes avant la ligne 3 doivent attendre jusqu'à ce que la ligne termine son travail, mais en raison de la ligne 3 est asynchrone, la ligne suivante (ligne 4), n'attendez pas la ligne 3, mais la ligne 5 doit attendre que la ligne 4 termine son travail, et la ligne 6 doit attendre les lignes 5 et 7 pour 6, car la ligne 4,5,6,7 n'est pas asynchrone.
Lors de l'exécution d'une séquence comme: a> b> c> d>, si nous obtenons un échec au milieu de l'exécution comme:
a
b
c
fail
Puis on recommence depuis le début:
a
b
c
d
c'est synchrone
Si, cependant, nous avons la même séquence à exécuter: a> b> c> d>, et nous avons un échec au milieu:
a
b
c
fail
... mais au lieu de redémarrer depuis le début, nous recommençons à partir du point d'échec:
c
d
... c'est asynchrone.
Vous confondez Synchronous avec Parallel vs Series. Synchrone signifie tout en même temps. Syncronisé signifie lié les uns aux autres ce qui peut signifier en série ou à un intervalle fixe. Pendant que le programme fait tout, il s'exécute en série. Obtenez un dictionnaire ... c'est pourquoi nous avons du thé non sucré. Vous avez du thé ou du thé sucré.
Synchrone signifie essentiellement que vous ne pouvez exécuter qu'une seule chose à la fois. Asynchrone signifie que vous pouvez exécuter plusieurs choses à la fois et que vous n'avez pas besoin de terminer l'exécution de la chose en cours pour passer à la suivante.
Utilisez un exemple d'instructions pour préparer un petit-déjeuner
Si vous avez de l'expérience en cuisine, vous exécuterez ces instructions de manière asynchrone. vous commencez à réchauffer la poêle pour les œufs, puis démarrez le bacon. Vous mettriez le pain dans le grille-pain, puis commenceriez les œufs. À chaque étape du processus, vous commenceriez une tâche, puis tourneriez votre attention vers des tâches qui sont prêtes à votre attention.
La cuisson du petit - déjeuner est un bon exemple de travail asynchrone qui n'est pas parallèle. Une seule personne (ou thread) peut gérer toutes ces tâches. Poursuivant l'analogie avec le petit-déjeuner, une personne peut préparer le petit-déjeuner de manière asynchrone en commençant la tâche suivante avant la fin du premier. La cuisson progresse, que quelqu'un le regarde ou non. Dès que vous commencez à réchauffer la poêle pour les œufs, vous pouvez commencer à faire frire le bacon. Une fois que le bacon commence, vous pouvez mettre le pain dans le grille-pain.
Pour un algorithme parallèle, vous auriez besoin de plusieurs cuisiniers (ou threads). L'un ferait les œufs, l'autre le bacon, etc. Chacun serait concentré sur cette seule tâche. Chaque cuisinier (ou fil) serait bloqué de manière synchrone en attendant que le bacon soit prêt à être retourné ou le toast à éclater.
Référence des concepts de programmation asynchrone
Une opération synchrone fait son travail avant de revenir à l'appelant.
Une opération asynchrone fait (la plupart ou la totalité) son travail après être retournée à l'appelant.
En ce qui concerne la définition "en même temps " de l'exécution synchrone (qui prête parfois à confusion), voici un bon moyen de la comprendre:
Exécution synchrone : toutes les tâches d'un bloc de code sont toutes exécutées en même temps.
Exécution asynchrone : toutes les tâches d'un bloc de code ne sont pas toutes exécutées en même temps.
Je pense qu'une bonne façon d'y penser est une course de relais classique
Synchrone : processus comme les membres de la même équipe, ils ne s'exécuteront pas tant qu'ils ne recevront pas de matraque (fin de l'exécution du processus / coureur précédent) et pourtant ils agissent tous en synchronisation les uns avec les autres.
Asynchrone : lorsque des processus comme des membres d'équipes différentes sur la même piste de course à relais, ils s'exécutent et s'arrêtent, en se synchronisant les uns avec les autres, mais au sein de la même course (exécution globale du programme).
Est-ce que ça fait du sens?
Une autre définition anglaise de Synchronize est ici
Coordonner; combiner.
Je pense que c'est une meilleure définition que de "se produire en même temps". Celui-là est aussi une définition, mais je ne pense pas que ce soit celui qui correspond à la façon dont il est utilisé en informatique.
Ainsi, une tâche asynchrone n'est pas coordonnée avec d'autres tâches, alors qu'une tâche synchrone EST coordonnée avec d'autres tâches, donc l'une se termine avant qu'une autre ne commence.
Comment cela est réalisé est une question différente.
Synchrone signifie que l'exécution une à une des tâches en file d'attente sera exécutée. Supposons qu'il n'y ait qu'un véhicule à partager entre amis pour atteindre leur destination un par un.
Dans le cas asynchrone, chaque ami peut obtenir un véhicule loué et atteindre sa destination.
Oui synchrone signifie en même temps, littéralement, cela signifie travailler tous ensemble. plusieurs humains / objets dans le monde peuvent faire plusieurs choses en même temps, mais si nous regardons l'ordinateur, cela signifie des moyens synchrones où les processus fonctionnent ensemble, ce qui signifie que les processus dépendent du retour les uns des autres et c'est pourquoi ils sont exécutés un après l'autre dans l'ordre approprié. Alors que asynchrone signifie que les processus ne fonctionnent pas ensemble, ils peuvent fonctionner en même temps (s'ils sont sur du multithread), mais fonctionnent indépendamment.