Donc, pour répondre à votre première et deuxième question :
Le non-blocage est en fait la même chose que l'asynchrone - vous faites l'appel et vous obtiendrez un résultat plus tard, mais pendant ce temps, vous pouvez faire autre chose. Le blocage est le contraire. Vous attendez le retour de l'appel avant de poursuivre votre chemin.
Le code asynchrone et non bloquant semble absolument fantastique, et il l'est. Mais j'ai des mots d'avertissement. L'asynchronisme et le non-blocage sont excellents lorsque l'on travaille dans des environnements contraints, comme dans un téléphone portable... pensez à l'unité centrale et à la mémoire limitées. C'est également une bonne chose pour le développement frontal, lorsque votre code doit réagir à un widget de l'interface utilisateur d'une manière ou d'une autre.
L'asynchronisme est fondamental pour le fonctionnement de tous les systèmes d'exploitation - ils font tout pour vous en arrière-plan et réveillent votre code lorsqu'ils ont fait ce que vous avez demandé, et lorsque cet appel échoue, vous êtes informé qu'il n'a pas fonctionné, soit par une exception, soit par une sorte de code de retour/objet d'erreur.
Au moment où votre code demande quelque chose qui prendra un certain temps à répondre, votre système d'exploitation sait qu'il peut s'occuper d'autres choses. Votre code - un processus, un thread ou équivalent, se bloque. Votre code est totalement inconscient de ce qui se passe dans le système d'exploitation pendant qu'il attend que la connexion réseau soit établie, qu'il attende la réponse à une requête HTTP, qu'il attende la lecture/écriture d'un fichier, etc. Votre code pourrait "simplement" attendre un clic de souris. Ce qui se passe en réalité pendant ce temps, c'est que votre système d'exploitation gère, planifie et réagit de manière transparente aux "événements" - des choses que le système d'exploitation surveille, comme la gestion de la mémoire, les E/S (clavier, souris, disque, Internet), d'autres tâches, la reprise après défaillance, etc.
Les systèmes d'exploitation sont sacrément durs. Ils sont vraiment bons pour cacher toutes les choses compliquées asynchrones / non bloquantes au programmeur. Et c'est ainsi que la plupart des programmeurs en sont arrivés là où nous en sommes aujourd'hui avec les logiciels. Maintenant que nous atteignons les limites des processeurs, les gens disent que les choses peuvent être faites en parallèle pour améliorer les performances. Cela signifie qu'Async / non-blocage semble être une chose très favorable à faire, et oui, si votre logiciel l'exige, je suis d'accord.
Si vous écrivez un serveur web back-end, procédez avec prudence. N'oubliez pas que vous pouvez évoluer horizontalement pour beaucoup moins cher. Netflix / Amazon / Google / Facebook sont des exceptions évidentes à cette règle, purement parce qu'il est plus économique pour eux d'utiliser moins de matériel.
Je vais vous dire pourquoi le code asynchrone / non bloquant est un cauchemar avec les systèmes back-end.....
1) Cela devient un déni de service sur la productivité... vous devez penser BEAUCOUP plus, et vous faites beaucoup d'erreurs en cours de route.
2) Les traces de pile dans le code réactif deviennent indéchiffrables - il est difficile de savoir ce qui a appelé quoi, quand, pourquoi et comment. Bonne chance pour le débogage.
3) Vous devez réfléchir davantage à la façon dont les choses échouent, surtout lorsque de nombreux éléments reviennent dans le désordre par rapport à la façon dont vous les avez envoyés. Dans l'ancien monde, vous faisiez une chose à la fois.
4) C'est plus difficile à tester.
5) Il est plus difficile à entretenir.
6) C'est pénible. La programmation devrait être une joie et un plaisir. Seuls les masochistes aiment la douleur. Les gens qui écrivent des frameworks concurrents/réactifs sont des sadiques.
Et oui, j'ai écrit à la fois sync et async. Je préfère le synchrone car 99,99 % des applications back-end peuvent s'en sortir avec ce paradigme. Les applications frontales ont besoin de code réactif, sans aucun doute, et cela a toujours été le cas.
-
Oui, le code peut être asynchrone, non bloquant ET basé sur des événements.
-
La chose la plus importante en programmation est de s'assurer que votre code fonctionne et répond dans un délai acceptable. Respectez ce principe clé et vous ne pourrez pas vous tromper.