Cet article présente principalement l'introduction des E/S asynchrones Node, qui ont une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
Expérience utilisateur
javascript est exécuté sur un seul thread, qui est le même thread que le thread de l'interface utilisateur. Si la synchronisation est utilisée, l'interface utilisateur sera exécutée. lorsque javascript est en cours d'exécution, le rendu doit s'arrêter et attendre, ce qui entraîne une très mauvaise expérience utilisateur.
Si la page Web doit demander certaines ressources et les obtenir de manière synchrone, alors nous devons attendre que js obtienne complètement les ressources du serveur avant de continuer à s'exécuter. Pendant cette période, l'interface utilisateur attend, ce qui provoquera le. interaction avec l'utilisateur à extrêmement mauvaise, affectant l'expérience utilisateur.
// 现在请求两个资源 //耗时为M毫秒 getData('from_db'); //耗时为N毫秒 getData('from_remote_api');
Si c'est synchrone, ça prendra du temps(M + N)
Si c'est asynchrone, ça prendra du tempsMax(M, N)
;
Avec la complexité de l'application , le scénario se transformera en M+N+...和Max(M,N,...)
, alors les avantages et les inconvénients de la synchronisation et de l'asynchronisme seront plus importants. D'un autre côté, à mesure que les sites Web et les applications se développent, les données sont souvent distribuées sur plusieurs serveurs, et la distribution signifie que les valeurs de M et N augmenteront de manière linéaire, ce qui amplifiera également la différence de performances entre asynchrone et synchrone. Bref, les IO coûtent cher, et les IO distribuées sont encore plus chères !
Allocation de ressources
E/S synchrone monothread
会因阻塞IO使得硬件资源无法得到更优的利用。
Programmation multithread
优点: 可以利用多核CPU有效提升CPU的利用率 缺点: 编程中的死锁、状态同步使得程序员很是头疼。
E/S asynchrones du nœud
node采用的异步IO,利用单线程,远离了多线程死锁、状态同步,利用异步让单线程远离了阻塞,使得CPU得到更好的利用。 为了弥补单线程无法利用多核CPU的问题,Node提供了子进程 `childProcess` ,将一些运算多的任务放入子进程进行高效的运算。
E/S bloquantes et E/S non bloquantes
E/S bloquantes
阻塞的IO操作就是发起IO操作后,线程阻塞等待IO完成,这期间cpu得不到有效利用。
E/S non bloquantes
非阻塞IO操作其实就是发起IO操作后,通过事件轮巡,或者事件通知机制,不断查询IO操作是否完成,或者是主线程进入休眠等待事件通知IO结束,然后继续向下执行代码,实际上非阻塞IO期间,cpu要不用来查询要不用来休眠,也没有得到有效利用。依旧是同步IO。
nécessitent un seul lien 事件循环
观察者
请求对象
pour terminer l’intégralité des E/S asynchrones.
En fait, l'IO asynchrone du nœud utilise la technologie du pool de threads. Lorsque l'IO asynchrone est lancée, l'opération io est lancée dans le pool de threads pour être exécutée, puis le thread principal continue d'effectuer d'autres opérations. l'exécution est notifiée via la communication inter-thread. Thread principal, le thread principal exécute le rappel.
Le thread IO est contrôlé par le pool de threads géré par Libuv
(sous Linux
est implémenté par libeio
; sous window
est implémenté par IOCP
) et est essentiellement multithread. Autrement dit, 线程池
et 阻塞IO
sont utilisés pour simuler 异步IO
.
Principe des IO asynchrones
Lorsque IO est rencontré, placez-le dans un thread IO dans le pool de threads, laissez la tâche est exécuté sur le thread IO, qui est exécuté en mode IO bloquant, puis continue l'exécution sur le thread principal lorsqu'une autre tâche IO est rencontrée, elle est placée dans le pool de threads, puis exécutée sur un autre thread IO (également). en mode IO bloquant), le thread principal continue de s'exécuter.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
Analyse du mécanisme du module Node
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!