Asynchrone vs Multithreading – Y a-t-il une différence?

Un appel asynchrone crée-t-il toujours un nouveau thread? Quelle est la différence entre les deux?

Un appel asynchrone crée-t-il ou utilise-t-il toujours un nouveau thread?

Wikipedia dit :

En programmation informatique, les événements asynchrones sont ceux qui se produisent indépendamment du stream principal du programme. Les actions asynchrones sont des actions exécutées dans un schéma non bloquant, permettant au stream de programme principal de poursuivre le traitement.

Je sais que les appels asynchrones peuvent être effectués sur des threads uniques? Comment est-ce possible?

Cette question est presque trop générale pour répondre.

Dans le cas général, un appel asynchrone ne crée pas nécessairement un nouveau thread. C’est une façon de l’implémenter, avec un pool de threads ou un processus externe préexistant. Cela dépend fortement du langage, du modèle d’object (le cas échéant) et de l’environnement d’exécution.

Asynchrone signifie simplement que le thread appelant ne rest pas assis et attend la réponse, ni l’activité asynchrone ne se produit dans le thread appelant.

Au-delà de cela, vous devrez être plus précis.

Chaque fois que l’opération qui doit se produire de manière asynchrone ne nécessite pas de faire fonctionner le processeur, cette opération peut être effectuée sans générer un autre thread. Par exemple, si l’opération asynchrone est E / S, la CPU n’a pas à attendre que les E / S soient terminées. Il suffit de lancer l’opération et de passer à d’autres tâches pendant que le matériel d’E / S (contrôleur de disque, interface réseau, etc.) fonctionne avec les E / S. Le matériel permet au processeur de savoir quand il a terminé en interrompant le processeur, puis le système d’exploitation transmet l’événement à votre application.

Fréquemment, les abstractions et les API de niveau supérieur n’exposent pas les API asynchrones sous-jacentes disponibles à partir du système d’exploitation et du matériel sous-jacent. Dans ces cas, il est généralement plus facile de créer des threads pour effectuer des opérations asynchrones, même si le thread généré attend juste une opération d’E / S.

Si l’opération asynchrone nécessite que le processeur fonctionne, alors cette opération doit généralement se produire dans un autre thread pour qu’elle soit vraiment asynchrone. Même alors, il ne sera réellement asynchrone que s’il y a plus d’une unité d’exécution.

Non, les appels asynchrones n’impliquent pas toujours des threads.

Ils commencent généralement une opération qui se poursuit parallèlement à l’appelant. Mais cette opération peut être gérée par un autre processus, par le système d’exploitation, par un autre matériel (comme un contrôleur de disque), par un autre ordinateur du réseau ou par un être humain. Les threads ne sont pas le seul moyen de faire les choses en parallèle.

Le multi-threading fait référence à plusieurs opérations se produisant dans le même processus. Tandis que la programmation asynchrone se propage à travers les processus. Par exemple, si mes opérations appellent un service Web, le thread n’a pas besoin d’attendre le retour du service Web. Ici, nous utilisons une programmation asynchrone qui permet au thread d’attendre la fin d’un processus sur une autre machine. Et quand il commence à recevoir une réponse du service Web, il peut interrompre le thread principal pour dire que le service Web a terminé le traitement de la demande. Maintenant, le thread principal peut traiter le résultat.

JavaScript est mono-thread et asynchrone. Lorsque vous utilisez XmlHttpRequest, par exemple, vous lui fournissez une fonction de rappel qui sera exécutée de manière asynchrone lorsque la réponse sera renvoyée.

John Resig a une bonne explication de la question connexe du fonctionnement des timers en JavaScript .

Windows a toujours eu un traitement asynchrone depuis les temps non préemptifs (versions 2.13, 3.0, 3.1, etc.) en utilisant la boucle de message, bien avant de prendre en charge les vrais threads. Donc, pour répondre à votre question, non, il n’est pas nécessaire de créer un thread pour effectuer un traitement asynchrone.

Les appels asynchrones n’ont même pas besoin de se produire sur le même système / périphérique que celui qui appelle l’appel. Donc, si la question est de savoir si un appel asynchrone nécessite un thread dans le processus en cours, la réponse est non. Cependant, il doit y avoir un thread d’exécution quelque part traitant la requête asynchrone.

Le fil d’exécution est un terme vague. Dans un système de tâches coopératif tel que les premiers systèmes d’exploitation Macintosh et Windows, le thread d’exécution pourrait simplement être le même processus qui faisait exécuter une autre stack, un pointeur d’instruction, etc. Cependant, lorsque les gens parlent généralement d’appels asynchrones , ils désignent généralement les appels traités par un autre thread s’il est intra-processus (c’est-à-dire dans le même processus) ou par un autre processus s’il est inter-processus.

Notez que la communication inter-processus (ou interprocess) (IPC) est généralement généralisée pour inclure la communication intra-processus, puisque les techniques de locking et de synchronisation des données sont généralement les mêmes quel que soit le processus d’exécution des threads séparés.

Certains systèmes vous permettent de tirer parti de la concurrence dans le kernel pour certaines installations utilisant des rappels. Pour une instance plutôt obscure, des rappels IO asynchrones ont été utilisés pour implémenter des serveurs Internet non bloquants lors des journées multitâches sans préemption de Mac System 6-8.

De cette façon, vous avez des stream d’exécution simultanés “in” que vous programmez sans threads en tant que tels .

Asynchrone signifie simplement que vous ne bloquez pas votre programme en attendant que quelque chose (appel de fonction, appareil, etc.) se termine. Il peut être implémenté dans un thread séparé, mais il est également courant d’utiliser un thread dédié pour des tâches synchrones et de communiquer via un système d’événement et d’obtenir ainsi un comportement asynchrone.

Il existe des exemples de programmes asynchrones à thread unique. Quelque chose comme:

...do something ...send some async request while (not done) ...do something else ...do async check for results 

La nature des appels asynchrones est telle que, si vous souhaitez que l’application continue à fonctionner pendant que l’appel est en cours, vous devrez soit générer un nouveau thread, soit utiliser au moins un autre thread que vous avez créé uniquement pour les besoins de gérer les rappels asynchrones.

Parfois, selon la situation, vous pouvez invoquer une méthode asynchrone, mais la faire apparaître synchrone à l’utilisateur (c’est-à-dire bloquer jusqu’à ce que la méthode asynchrone ait indiqué qu’elle est terminée). Cela peut être réalisé via les API Win32 telles que WaitForSingleObject .

Une opération asynchrone est une opération qui continue en arrière-plan après avoir été lancée, sans forcer l’appelant à attendre qu’elle se termine avant d’exécuter un autre code.

Au lieu de bloquer le programme appelant (ou le thread) jusqu’à ce qu’une réponse arrive, une implémentation asynchrone (également appelée non bloquante) enverra une requête à la firebase database ou au service Web ou autre, puis reviendra immédiatement, laissant votre programme continuer à exécuter tandis que le service distant envoie une réponse. Une fois la réponse reçue, le système exécutera un rappel (dans votre boucle de messages ou dans un thread de port d’achèvement des E / S distinct, en fonction de l’environnement), permettant à votre code de gérer la réponse.

Multi-threading signifie exécuter plusieurs threads d’exécution à la fois. Dans ce modèle, toutes les opérations sont toujours synchrones, mais le processeur exécute plusieurs threads d’opérations synchrones en même temps.

Le multi-threading est très utile lorsque vous appelez plusieurs opérations liées à l’UC, sur un processeur multicœur. Par exemple, un programme qui parsing indépendamment chaque pixel d’une image peut diviser l’image en une seule bande pour chaque cœur de processeur, puis parsingr chaque bande dans son propre thread en même temps.

Lire plus ici – https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/