Quelle est la différence entre une exécution asynchrone et synchrone?
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 la fin.
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) existant en tant qu'unité de travail. Le système d'exploitation peut gérer plusieurs threads et attribuer à un thread une partie ("tranche") de temps processeur avant de passer à un autre thread afin de lui permettre de travailler. À la base (pardon, le jeu de mots), un processeur peut simplement exécuter une commande, il n'a pas le 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 mélange, 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 complexe en raison de la sémantique de la façon dont les choses sont liées 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-FILETAGE.
Synchrone ou Synchronized signifie "connecté" ou "dépendant" d'une manière ou d'une autre. En d'autres termes, deux tâches synchrones doivent être conscientes l'une de l'autre et une tâche doit être exécutée de manière dépendante de l'autre, par exemple attendre le démarrage de l'autre tâche.
Asynchrone signifie qu’ils sont totalement indépendants et qu’aucun ne doit considérer l’autre de quelque manière que ce soit, que ce soit en phase d’initiation ou en exécution.
Synchrone (un fil):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Synchrone (multi-threaded):
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--------->|
<
, >
.|
Techniquement, le concept de synchrone/asynchrone vraiment n'a rien à voir avec les threads. Bien qu'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 commun de rechercher deux ou plusieurs tâches s'exécutant de manière synchrone sur Separate. threads ... Non, le concept de synchrone/asynchrone a à faire uniquement avec le fait de savoir si une seconde 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. Le ou les threads, ou les processus, ou les processeurs, ou bien le matériel sur lequel la tâche est exécutée n'est pas pertinent. En effet, pour faire valoir ce point, j’ai édité les graphiques pour le montrer.
EXEMPLE ASYNCHRONE. En résolvant de nombreux problèmes d'ingénierie, le logiciel est conçu pour diviser le problème global en plusieurs tâches individuelles, puis pour les exécuter de manière asynchrone. L'inversion d'une matrice ou d'un problème d'analyse par éléments finis en 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 trie chacune d’elles en s’appelant elle-même 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 seconde 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 pour 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 de l’autre est nécessaire), elles sont exécutées de manière asynchrone, quel que soit le nombre de threads utilisés.
EXEMPLE SYNCHRONE. Tout processus consistant en plusieurs tâches dans lesquelles les tâches doivent être exécutées en séquence, mais l’un doit être exécuté sur une autre machine (extraction et/ou mise à jour des données, obtention d’une valorisation boursière auprès d’un service financier, etc.). Si c'est sur une machine séparée, c'est sur un thread séparé, 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 en ait un, et il en va de même pour les personnes en file d'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 préparée et servie avant de pouvoir commander ... Dans la cuisine, les ouvriers des restaurants préparent, servent et prennent les commandes en permanence ... 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: bien. Je commence et il me regarde comme un vautour, debout derrière moi, sur mon épaule. Je suis comme "Mec, WTF: pourquoi ne vas-tu pas faire quelque chose pendant que je termine ça?"
il est comme: "Non, je j'attends ici} jusqu'à la fin." C'est synchrone.
Exécution asynchrone
Le patron me dit de le faire, et plutôt que d’attendre mon travail ici, il s’exécute et accomplit d’autres tâches. Lorsque je termine mon travail, je fais simplement un rapport à mon patron et lui dit: "Je suis FAIT!" C'est une exécution asynchrone.
(Suivez mon conseil: ne travaillez JAMAIS avec le patron derrière vous.)
Exécution synchrone signifie que l'exécution se déroule en une seule série. A->B->C->D
. Si vous appelez ces routines, A
sera exécuté, puis fini, puis B
commencera, puis se terminera, puis C
commencera, etc.
Avec 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émarrerA->B->C->D->
Attendre que A
soit terminé
L'avantage est que vous pouvez exécuter B
, C
et ou D
pendant que 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 limiter le nombre de "blocages" ou "d'attentes".
Synchrone signifie que l'appelant attend la réponse ou l'achèvement, asynchrone qu'il 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");
}
Ce sera toujours ouput:
Before call
In call
After call
Mais si nous devions faire quelque chose d'asynchrone (plusieurs façons de le faire), alors la sortie pourrait devenir:
Before call
After call
In call
Parce que la méthode faisant 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 les opérations asynchrones. Il peut également s’exécuter comme l’original, en fonction du minutage des threads, etc.
En un mot, la synchronisation fait référence à deux ou plusieurs processus 'start et end points, NOT leurs exécutions. Dans cet exemple, le noeud final du processus A est synchronisé avec le point de départ du processus B:
SYNCHRONE | -------- A -------- | | -------- B -------- |
Les processus asynchrones, en revanche, font pas leurs points de départ et leurs points de terminaison 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 du dictionnaire), d'où la confusion.
MISE À JOUR: Charles Bretana a amélioré sa réponse , cette réponse est donc maintenant un simple mnémonique (potentiellement simpliste).
Je pense que ceci est une explication un peu circulaire mais il clarifie tout de même en utilisant des exemples réels.
Petit exemple:
Disons que la lecture d'un fichier audio implique trois étapes:
Si votre lecteur audio effectue les étapes 1,2,3 de manière séquentielle pour chaque chanson, il est synchrone. Vous devrez attendre un certain temps pour entendre la chanson jusqu'à ce qu'elle soit récupérée et décompressée.
Si votre lecteur audio effectue les étapes 1, 2, 3 indépendamment l’un de l’autre, il est asynchrone. ie . 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 s'il décompresse l'audio 2 en parallèle. (étape 2) Vous finirez par entendre la chanson sans trop attendre pour aller chercher et décompresser.
Simplement dit, l'exécution asynchrone fait des choses en arrière-plan.
Par exemple, si vous souhaitez télécharger un fichier à partir d'Internet, vous pouvez utiliser une fonction synchrone pour le faire, mais cela bloquera votre thread jusqu'à la fin du téléchargement du fichier. Cela peut rendre votre application insensible à toute entrée d'utilisateur.
Au lieu de cela, vous pouvez télécharger le fichier en arrière-plan en utilisant une 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 de son exécution.
Lors de l'exécution d'une séquence comme: a> b> c> d>, si nous rencontrons un échec en cours d'exécution comme:
a
b
c
fail
Puis on recommence depuis le début:
a
b
c
d
c'est synchrone
Si, toutefois, 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 recommencer depuis le début, nous repartons du point de l'échec:
c
d
... Ceci est connu comme asynchrone.
Modèle de programmation synchrone - Un thread est affecté à une tâche et commence à fonctionner dessus. Une fois la tâche terminée, elle est disponible pour la tâche suivante. Dans ce modèle, il ne peut pas laisser la tâche en cours d'exécution au milieu pour entreprendre une autre tâche. Voyons comment ce modèle fonctionne dans des environnements mono et multi-threadés.
Single Threaded _ - Si nous avons plusieurs tâches à traiter et que le système actuel ne fournit qu'un seul thread, les tâches sont affectées au thread une à une. Il peut être décrit de manière imagée comme
Multi-Threaded - Dans cet environnement, nous avions plusieurs threads qui pouvaient prendre en charge ces tâches et commencer à travailler dessus. Cela signifie que nous avons un pool de threads (de nouveaux threads peuvent également être créés en fonction des besoins et des ressources disponibles) et de nombreuses tâches. Donc, ces fils peuvent fonctionner comme
Modèle de programmation asynchrone - Contrairement au modèle de programmation synchrone, un thread commençant à exécuter une tâche peut le conserver au milieu, enregistrer l'état actuel et commencer à exécuter une autre tâche.
Comme un exemple très simple,
SYNCHRONE
Imaginez 10 élèves qui ont reçu l’ordre de marcher en file sur une route.
La 3e élève a eu son lacet détaché. Maintenant, elle a arrêté et attache à nouveau.
Tous les élèves derrière elle se sont arrêtés et attendent maintenant qu'elle le resserre. Les 1er et 2e élèves les ont tous dépassés et ont continué à suivre leur rythme habituel.
10-->9-->8-->7-->6-->5-->4-->3. 2-->1-->
ASYNCHRONE
Imaginez 10 personnes au hasard marchant sur la même route. Bien sûr, ils ne font pas la queue, ils marchent au hasard sur différents endroits de la route, à des rythmes différents.
Le lacet de la troisième personne s'est détaché. Elle s’arrêta pour le ligoter à nouveau.
Mais personne n'attend qu'elle soit attachée. Tous les autres marchent toujours comme avant, au même rythme que les leurs.
10--> 9-->
8--> 7--> 6-->
5--> 4--> 3. 2-->
1-->
Vous confondez Synchrone avec Parallel vs Series. Synchrone signifie tout en même temps. Syncronized signifie en relation l'un avec l'autre ce qui peut signifier en série ou à un intervalle fixe. Pendant que le programme fait tout, il fonctionne 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 fondamentalement que vous ne pouvez exécuter qu'une chose à la fois. Asynchrone signifie que vous pouvez exécuter plusieurs tâches à la fois sans avoir à terminer l'exécution de la tâche en cours pour pouvoir passer à la suivante.
Une opération synchrone fait son travail avant de retourner à l'appelant.
Une opération asynchrone effectue son travail (la plupart ou la totalité) après son retour chez l'appelant.
J'ai créé un gif pour expliquer cela, j'espère pouvoir vous aider: 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 comme la ligne 3 est asynchrone, la ligne suivante (ligne 4), n'attendez pas la ligne 3, mais la ligne 5 doit attendre la fin de la ligne 4 et la ligne 6 doit attendre les lignes 5 et 7 pendant 6, car les lignes 4, 5, 6 et 7 ne sont pas asynchrones.
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 commencez le bacon. Vous mettez le pain dans le grille-pain, puis commencez les œufs. À chaque étape du processus, vous démarrez une tâche, puis portez votre attention sur les tâches qui sont prêtes à attirer votre attention.
La préparation du petit-déjeuner est un bon exemple de travail asynchrone non parallèle. Une personne (ou un fil) peut gérer toutes ces tâches. En continuant l'analogie du petit-déjeuner, une personne peut préparer le petit-déjeuner de manière asynchrone en démarrant la tâche suivante avant la fin de la première. La cuisson progresse, que quelqu'un la 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 aurez besoin de plusieurs cuisiniers (ou threads). On ferait les œufs, un le bacon, etc. Chacun serait concentré sur cette tâche. Chaque cuisinier (ou fil) serait bloqué de manière synchrone en attendant que le bacon soit prêt à être retourné, ou que le pain grillé sorte.
Référence de Concepts de programmation asynchrone
Je pense qu’un bon moyen d’y penser est une course de relais classique.
Synchrone : Les processus ressemblant aux membres de la même équipe, ils ne seront pas exécutés tant qu'ils n'auront pas reçu témoin (fin de l'exécution du processus/coureur précédent) et qu'ils agiront tous en synchronisation les uns avec les autres.
Asynchrone : Lorsque des processus tels que les membres d'équipes différentes sur la même piste de course à relais, ils courent et s'arrêtent, de manière asynchrone, mais dans la même course (exécution globale du programme).
Est-ce que ça fait du sens?
En ce qui concerne la définition "en même temps" de l'exécution synchrone (ce qui est parfois déroutant), 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.
Une définition anglaise différente de Synchronize est Here
Coordonner; combiner.
Je pense que c'est une meilleure définition que celle de "se produire en même temps". Cette définition est également une définition, mais je ne pense pas que ce soit celle qui convient à la manière dont elle est utilisée en informatique.
Ainsi, une tâche asynchrone n'est pas coordonnée avec d'autres tâches, alors qu'une tâche synchrone IS est coordonnée avec d'autres tâches. Ainsi, une tâche se termine avant celle d'une autre.
Comment cela est réalisé est une question différente.
Oui synchrone signifie en même temps, littéralement, cela signifie que nous travaillons tous ensemble. de multiples objets/personnes dans le monde peuvent faire plusieurs choses à la fois, mais si on regarde un ordinateur, cela signifie que synchrone signifie que les processus fonctionnent ensemble, ce qui signifie que les processus dépendent du retour l'un de l'autre et que c'est pourquoi ils sont exécutés 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 multithread), mais fonctionnent de manière indépendante.
Synchrone signifie que l'exécution d'une file d'attente d'une tâche à une autre sera exécutée. Supposons que seul un véhicule qui doit être partagé entre amis pour atteindre leur destination soit partagé.
Dans un cas asynchrone, chaque ami peut louer un véhicule et atteindre sa destination.