La concurrence consiste à exécuter deux tâches en parallèle sur des threads distincts. Cependant, les méthodes asynchrones s'exécutent en parallèle mais sur le même thread. Comment cela est-il réalisé? Et qu'en est-il du parallélisme?
Quelles sont les différences entre ces 3 concepts?
multithreading
asynchronous
concurrency
GurdeepS
la source
la source
Réponses:
Concurrent et parallèle sont effectivement le même principe que vous supposez correctement, les deux sont liés à des tâches exécutées simultanément, même si je dirais que les tâches parallèles devraient être vraiment multitâches, exécutées «en même temps» alors que concurrentes pourrait signifier que les tâches partagent le thread d'exécution tout en semblant toujours s'exécuter en parallèle.
Les méthodes asynchrones ne sont pas directement liées aux deux concepts précédents, l'asynchronie est utilisée pour présenter l'impression de tâches simultanées ou parallèles, mais effectivement, un appel de méthode asynchrone est normalement utilisé pour un processus qui doit travailler loin de l'application actuelle et nous ne ne veux pas attendre et bloquer notre application en attendant la réponse.
Par exemple, obtenir des données à partir d'une base de données peut prendre du temps, mais nous ne voulons pas bloquer notre interface utilisateur en attendant les données. L'appel asynchrone prend une référence de rappel et renvoie l'exécution à votre code dès que la demande a été placée auprès du système distant. Votre interface utilisateur peut continuer à répondre à l'utilisateur pendant que le système distant effectue le traitement nécessaire, une fois qu'il a renvoyé les données à votre méthode de rappel, cette méthode peut mettre à jour l'interface utilisateur (ou transférer cette mise à jour) selon le cas.
Du point de vue de l'utilisateur, cela ressemble à du multitâche, mais ce n'est peut-être pas le cas.
ÉDITER
Cela vaut probablement la peine d'ajouter que dans de nombreuses implémentations, un appel de méthode asynchrone provoquera la rotation d'un thread, mais ce n'est pas essentiel, cela dépend vraiment de l'opération en cours d'exécution et de la manière dont la réponse peut être notifiée au système.
la source
En bref,
La simultanéité signifie plusieurs tâches qui démarrent, s'exécutent et se terminent dans des périodes de temps qui se chevauchent, sans ordre spécifique. Le parallélisme se produit lorsque plusieurs tâches OU plusieurs parties d'une tâche unique s'exécutent littéralement en même temps, par exemple sur un processeur multicœur.
Différences entre la concurrence et le parallélisme
Maintenant, énumérons les différences remarquables entre la concurrence et le parallélisme.
La concurrence est le moment où deux tâches peuvent démarrer, s'exécuter et se terminer dans des périodes qui se chevauchent. Le parallélisme est lorsque les tâches s'exécutent littéralement en même temps, par exemple. sur un processeur multicœur.
La concurrence est la composition de processus exécutés indépendamment, tandis que le parallélisme est l'exécution simultanée de calculs (éventuellement liés).
La concurrence consiste à gérer beaucoup de choses à la fois. Le parallélisme consiste à faire beaucoup de choses à la fois.
Une application peut être concurrente - mais pas parallèle, ce qui signifie qu'elle traite plus d'une tâche en même temps, mais aucune tâche ne s'exécute en même temps.
Une application peut être parallèle - mais pas simultanée, ce qui signifie qu'elle traite plusieurs sous-tâches d'une tâche dans un processeur multicœur en même temps.
Une application ne peut être ni parallèle ni concurrente, ce qui signifie qu'elle traite toutes les tâches une par une, séquentiellement.
Une application peut être à la fois parallèle et concurrente, ce qui signifie qu'elle traite plusieurs tâches simultanément dans un processeur multicœur en même temps.
Concurrence
Parallélisme
Méthodes asynchrones
la source
La concurrence se produit lorsque l'exécution de plusieurs tâches est entrelacée, au lieu que chaque tâche soit exécutée séquentiellement l'une après l'autre.
Le parallélisme se produit lorsque ces tâches sont réellement exécutées en parallèle.
L'asynchronie est un concept distinct (même s'il est lié dans certains contextes). Cela fait référence au fait qu'un événement peut se produire à un moment différent (pas en synchronisme) avec un autre événement. Les schémas ci-dessous illustrent la différence entre une exécution synchrone et asynchrone, où les acteurs peuvent correspondre à différents threads, processus ou même serveurs.
la source
Tout le monde a du mal à associer asynchrone au parallélisme ou à la concurrence car asynchrone n'est pas un antonyme de parallèle ou simultané. C'est un antonyme de synchrone. Ce qui indique simplement si quelque chose, dans ce cas les threads, sera synchronisé avec autre chose, dans ce cas un autre thread.
la source
Il existe plusieurs scénarios dans lesquels la concurrence peut se produire:
Asynchronie - Cela signifie que votre programme effectue des opérations non bloquantes. Par exemple, il peut lancer une requête pour une ressource distante via HTTP, puis effectuer une autre tâche en attendant que la réponse soit reçue. C'est un peu comme lorsque vous envoyez un email et que vous continuez votre vie sans attendre de réponse.
Parallélisme - Cela signifie que votre programme exploite le matériel des machines multicœurs pour exécuter des tâches en même temps en divisant le travail en tâches, chacune étant exécutée sur un noyau distinct. C'est un peu comme chanter sous la douche: en fait, vous faites exactement deux choses en même temps.
Multithreading - Il s'agit d'une implémentation logicielle permettant à différents threads d'être exécutés simultanément. Un programme multithread semble faire plusieurs choses en même temps même s'il s'exécute sur une machine monocœur. C'est un peu comme discuter avec différentes personnes via diverses fenêtres de messagerie instantanée; bien que vous changiez en fait, le résultat net est que vous avez plusieurs conversations en même temps.
la source
De http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
la source
Parallèle:C'est un terme large qui signifie que deux morceaux de code exécutent cela "en même temps". Peu importe s'il s'agit d'un "vrai" parallélisme ou s'il est truqué par un modèle de conception intelligent. Le fait est que vous pouvez démarrer les «tâches» en même temps et les contrôler ensuite séparément (avec mutex et toutes les astuces appropriées). Mais généralement, vous préférez utiliser le mot «parallèle» uniquement pour le «vrai» parallélisme, comme dans: vous le faites par le biais d'un multitâche non coopératif (qu'il s'agisse de traiter les cœurs CPU / GPU, ou uniquement au niveau logiciel en laissant le système d'exploitation le gérer à un niveau très bas). Les gens hésitent à dire «parallèle» juste pour du code séquentiel compliqué qui simule le parallélisme, comme vous le trouverez dans le javascript d'une fenêtre de navigateur par exemple. D'où la raison pour laquelle les gens de ce fil disent que "asynchrone n'a rien à voir avec le parallélisme". Eh bien c'est le cas, mais ne les confondez pas.
Concurrent: il ne peut pas y avoir de concurrence sans parallélisme (qu'il soit simulé ou réel, comme je l'ai expliqué ci-dessus), mais ce terme se concentre spécifiquement sur le fait que les deux systèmes essaieront d'accéder à la même ressource en même temps à un moment donné. Cela met l'accent sur le fait que vous allez devoir vous en occuper.
Asynchrone : tout le monde a raison de dire que l'asynchrone n'est pas lié au parallélisme, mais cela ouvre la voie (il vous incombe de rendre les choses parallèles ou non - continuez à lire).
«Asynchrone» fait référence à une représentation du parallélisme qui formalise les trois éléments de base généralement impliqués dans le parallélisme: 1) définir l'initialisation de la tâche (par exemple, quand elle démarre et quels paramètres elle obtient), 2) ce qui doit être fait après la fin et 3) Ce que le code doit continuer à faire entre les deux.
Mais ce n'est toujours que de la syntaxe (généralement représentée comme des méthodes de rappel). En coulisse, le système sous-jacent pourrait simplement décider que ces soi-disant «tâches» ne sont que des fragments de code à empiler jusqu'à ce qu'il termine le code qu'il est en cours d'exécution. Et puis il les dépile un par un et les exécute séquentiellement. Ou pas. Il peut également créer un thread par tâche et les exécuter en parallèle. On s'en fout? Cette partie n'est pas incluse dans le concept;)
la source
Il y a un peu de sémantique à clarifier ici:
La concurrence ou le parallélisme est une question de conflit de ressources , tandis que Asynchrone concerne le flux de contrôle .
Différentes procédures (ou leurs opérations constituantes ) sont dites asynchrones, lorsqu'il n'y a pas d'implémentation déterministe de l'ordre de leur traitement ; en d'autres termes, il y a une probabilité que l'un d'entre eux puisse être traité à un moment donné T. Par définition, plusieurs processeurs (par ex. CPU ou Personnes) permettent de traiter plusieurs d'entre eux en même temps; sur un seul processeur, leur traitement est entrelacé (par exemple Threads).
Les procédures ou opérations asynchrones sont appelées simultanées lorsqu'elles partagent des ressources ; La concurrence est la possibilité définitive de conflit à un moment donné T. Le parallélisme est garanti de manière triviale lorsqu'aucune ressource n'est partagée (par exemple, processeur et stockage différents); sinon, le contrôle de la concurrence doit être abordé.
Par conséquent, une procédure ou opération asynchrone peut être traitée en parallèle ou simultanément avec d'autres.
la source
La concurrence consiste à exécuter plusieurs tâches en même temps, mais pas nécessairement simultanément. Lorsque vous devez effectuer plus d'une tâche mais que vous avez une seule ressource, nous optons pour la concurrence. Dans un environnement à cœur unique, la concurrence est obtenue par la commutation de contexte.
Le parallélisme, c'est comme effectuer plus d'une tâche simultanément, comme vous pouvez chanter et vous baigner ensemble. Maintenant, vous effectuez une tâche en parallèle.
Asynchrone est quelque chose qui est lié à l'exécution de thread dans un modèle asynchrone lorsqu'une tâche est exécutée, vous pouvez passer à une tâche différente sans attendre que la précédente soit terminée.
La programmation asynchrone nous aide à atteindre la concurrence. La programmation asynchrone dans un environnement multi-thread est un moyen de réaliser le parallélisme.
la source
"Sync et async sont des modèles de programmation. Concurrent et parallèle sont des façons dont les tâches sont exécutées ...". Source: https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66
En d'autres termes, sync et async décrivent comment votre programme s'exécute lors d'un appel de fonction (va-t-il attendre ou continuera-t-il à s'exécuter?), Tandis que simultané et parallèle décrivent comment une fonction (une tâche) sera exécutée (simultanée = éventuellement exécutée à en même temps, parallèle = effectivement exécuté en même temps).
la source
CONCURRENCE VS PARALLELISM: la concurrence à un moment donné, une seule tâche peut être effectuée. exemple: parallélisme de processeur CPU unique à un moment donné, nous pouvons effectuer plusieurs tâches. exemple: processeur dual core ou multi core
la source
Ici, j'explique avec quelques exemples
Parallélisme
Un GPU utilise un traitement parallèle pour traiter le même bloc de code ( noyau AKA ) sur des milliers de threads physiques et logiques. Idéalement, le processus démarre et se termine pour tous les threads en même temps. Un seul cœur de processeur sans hyperthreading ne peut pas effectuer de traitement parallèle.
Remarque: je l'ai dit idéalement, car lorsque vous exécutez un noyau avec une taille de 7M appels sur un matériel avec 6M de threads, il doit exécuter deux fois le même code sur tous les 6M threads en parallèle tout en consommant tous les 6M threads à chaque fois.
Remarque: le parallélisme n'est pas limité au GPU.
Concurrence
Un service web reçoit de nombreuses petites demandes en temps réel et il doit traiter chacune de ces demandes différemment, à tout moment, et indépendamment des autres demandes ou des travaux internes. Pourtant, vous voulez que le service Web soit opérationnel à tout moment sans altérer l'état des données ou la santé du système.
Imaginez simplement un utilisateur mettant à jour un enregistrement et un autre utilisateur supprimant le même enregistrement en même temps.
Remarque : ces demandes consomment généralement des ressources essentielles telles que la mémoire, la connexion à la base de données ou la bande passante. Pourtant, vous voulez que le service Web soit réactif à tout moment. L'asynchrone est la clé pour la rendre réactive , pas la concurrence
Asynchrone
Un processus lourd (comme une opération d'E / S) peut facilement bloquer l'interface graphique s'il est exécuté sur le thread GUI. Afin de garantir la réactivité de l'interface utilisateur , un processus lourd peut être exécuté de manière asynchrone. Il est préférable d'exécuter des opérations asynchrones similaires une à la fois . Par exemple, plusieurs opérations liées aux E / S peuvent être beaucoup plus lentes si elles sont exécutées en même temps, il est donc préférable de les mettre en file d' attente pour qu'elles commencent
Remarque: une opération asynchrone qui est exécutée simultanément (c'est-à-dire plus d'une fois à la fois) est une opération simultanée.
Remarque: la concurrence et l'asynchrone sont souvent confondues. La concurrence fait référence à différentes parties du système travaillant ensemble sans interférer les unes avec les autres (ces problèmes sont souvent résolus avec des verrous, des sémaphores ou des mutex). L'asynchrone est la façon dont vous atteignez la réactivité (comme le threading).
* Remarque: l' asynchrone et le multithreading sont souvent confondus. Le code asynchrone n'implique pas nécessairement un nouveau thread. cela peut être une opération matérielle ou comme Stephan l' appelle une opération pure, lisez ceci
par exemple, dans le code WPF + C # ci-dessous,
await Task.Run(()=> HeavyMethod(txt))
résout un problème d'asynchrone, tout entextBox.Dispatcher.Invoke
résolvant un problème de concurrence:la source
Je vais faire court et intéressant pour comprendre ces concepts.
Concurrent vs Parallel - Façon dont les tâches sont exécutées.
Synchrone vs Asynchrone - Modèles de programmation.
la source