function ImmediateList() { this.head = null; this.tail = null; } 从上面的代码中我们知道,调用setImmediate函数后,nodejs...] -= refCount; immediateInfo[kHasOutstanding] = 0; } setImmediateCallback函数来自timer_wrapper.cc,我们看到nodejs...\ } 然后就会执行刚才注册的CheckImmediate,一直执行到nodejs
之前分析过线程的代码,最近在使用线程,继续分析一下。我们先看一下一般的使用例子。...下面我们开始分析源码。分析完,会对上面的代码有更多的理解。 首先我们从worker_threads模块开始分析。这是一个c++模块。我们看一下他导出的功能。...; env->SetMethod(target, "getEnvMessagePort", GetEnvMessagePort); /* 线程id,这个不是操作系统分配的那个,而是nodejs..._parent_port和child_port是给nodejs使用的,新申请的管道是给用户使用的。 3 创建子线程。 我们看创建线程的时候,做了什么。...总结,以上就是nodejs中关于线程的基本原理,线程的实现也非常复杂,大致了解他的原理,才能更好地使用他。
今天我们来分析connect函数。connect是发起tcp连接的api。本质上是对底层tcp协议connect函数的封装。我们看一下nodejs里做了什么事情。..._onTimeout.bind(this), msecs); // 监听timeout事件,定时器超时时,底层会调用nodejs的回调,nodejs会调用用户的回调callback if...所以我们主要来分析connect。我们把关于connect的这段逻辑拎出来。...至此,connect函数分析完毕。本文对connect函数进行了粗略的分析,如果有兴趣,欢迎交流。...更多阅读 1 记一次nodejs问题排查 2 nodejs源码分析之c++层的通用逻辑 3 libuv源码分析之stream第二篇 4 深入理解TCP/IP协议的实现之connect(基于linux1.2.13
可读流是对数据消费的抽象,nodejs中可读流有两种工作模式:流式和暂停式,流式就是有数据的时候就会触发回调,并且把数据传给回调,暂停式就是需要用户自己手动执行读取的操作。...我们通过源码去了解一下可读流实现的一些逻辑。因为实现的代码比较多,逻辑也比较绕,本文只分析一些主要的逻辑,有兴趣的可以参考文档或者自行深入看源码了解细节。...nodejs只是抽象了流的逻辑,具体的操作(比如可读流就是读取数据)是由用户自己实现的,因为读取操作是业务相关的。下面我们分析一下可读流的操作。..._destroy = function(err, cb) { this.push(null); cb(err); }; 刚才分析push函数时已经看到this.push(null)表示流结束了。...总结:本文就分析到这里,流的实现代码不算很难,但是非常绕,有兴趣的可以详细看源码,最后分享很久之前画的一个图(链接https://www.processon.com/view/link/5cc7e9e5e4b09eb4ac2e0688
我们从setImmediate开始分析, function setImmediate(callback, arg1, arg2, arg3) { if (typeof callback !...nodejs在初始化的时候,会在check阶段插入一个节点,并注册一个回调。
这一篇我们来看看nodejs是如何实现定时器的。14.0.0的nodejs对定时器模块进行了重构,之前版本的实现是用一个map,以超时时间为键,每个键对应一个队列。即有同样超时时间的节点在同一个队列。...了解完定时器整体的组织和基础数据结构,我们可以开始进入真正的源码分析了。 我们直接从setTimeout函数开始。...timers_callback_function是在nodejs初始化的时候设置的。我们先暂定一下,看一下定时器模块的初始化流程。再回来这里分析。...nodejs在初始化的时候通过一下代码对定时器进行了初始化工作。...定时器模块的setTimeout分析完了,后面有机会的话再补充一下,另外setInterval是类似的。
FixedQueue是用来实现nextTick的。代码不多。 'use strict'; const { Array, } = primordials; ...
nodejs的dns解析模块是dns.js,下面是一个使用的例子。...dns.lookup('www.a.com', function(err, address, family) { console.log(address); }); 我们根据沿着这个例子的代码看一下nodejs...onlookupall : onlookup; var err = cares.getaddrinfo(req, hostname, family, hints, verbatim); nodejs...这里以非阻塞的方式为例子进行分析,uv__work_submit函数是给线程池对应的任务队列新增一个节点,然后线程执行的时候,会取下某个节点,执行设置的函数,这里被执行的函数是uv__getaddrinfo_work...nodejs的通过ip和端口查找host的lookupserverce函数也是类似的原理
流是对数据生产,消费的一种抽象,今天先分析一下流基类的实现 const EE = require('events'); const util = require('util'); // 流的基类 function
this.createSocket(req, options, socketCreationHandler); 37. } 38. }; 前面已经分析过,Agent维护了两个socket...我们主要分析创建socket后的回调handleSocketCreation。 1...._http_client.js是对http客户端的封装,当我们使用nodejs发送一个请求的时候,就会使用_http_client.js的ClientRequest。
链表的实现比较简单,有几个模块使用了这个功能,定时器就是其中一个。 'use strict'; function init(list) { list._...
nodejs支持了进程之后,又支持了线程。类似浏览器端的web worker。因为nodejs是单线程的,但是底层又实现了一个线程池,接着实现了进程,又实现了线程。...上篇大致分析了进程的原理,这一篇来讲一下线程的原理。只有了解线程的实现,才能知道什么时候应该用线程,为什么可以用线程。 线程的实现也非常复杂。...虽然底层只是对线程库的封装,但是把它和nodejs原本的架构结合起来似乎就变得麻烦起来。下面开始分析创建线程的过程。分析线程实现之前,我们先看一下线程通信的实现,因为线程实现中会用到。...分析完线程通信的实现,我们开始分析线程的实现。nodejs中node_worker.cc实现了线程模块的功能。我们看一下这个模块的定义。...以上就是nodejs中线程的大致原理。
nodejs的模块分为几种,有内置的c++模块,内置的js模块,还有用户自定义的模块。下面我们先分析内置模块。然后在分析用户定义的模块。...1 内置模块 首先以注册tcp_wrap.cc模块为例子,一步步分析一下c++模块的注册。下面是tcp_wrap.cc模块的最后一句代码。...一个模块的代码,在nodejs看来其实只是一个字符串,nodejs在require这个模块的时候,会在整个模块代码包裹在一个函数里。...this.exports = {}; this.loaded = false; this.loading = false; } // lib下的js,是一个模块路径到源码的对象...模块系统的模块查找和缓存还有很多细节,有时间继续分析。
这是分析nodejs 14.0.0的第一篇文章,后面会继续分析nodejs14.0.0的代码,如果nodejs主干源码更新,也会同步更新分析,欢迎交流和加入。...nodejs了实现了一个优先队列,在重构定时器模块的时候,用到了这个数据结构。了解这个模块是分析定时器模块的基础。...heap[1]; if (value === undefined) return; this.removeAt(1); return value; } }; nodejs
我们知道nodejs是单进程(单线程)的,但是nodejs也为用户实现了多进程的能力,下面我们看一下nodejs里多进程的架构是怎么样的。 nodejs提供同步和异步创建进程的方式。...我们首先看一下异步的方式,nodejs创建进程的方式由很多种。但是归根到底是通过spawn函数。所以我们从这个函数开始,看一下整个流程。...nodejs主进程会收到SIGCHLD信号。然后执行uv__chld。...uv_loop_, &uv_process_, &uv_process_options_); r = uv_run(uv_loop_, UV_RUN_DEFAULT); } 我们看到,对于同步创建进程,nodejs...我们知道uv_run是一个死循环,所以这时候,nodejs主进程会阻塞在上面的uv_run。直到子进程退出,uv_run才会退出循环,从而再次回到nodejs原来的事件循环。
NodeJs Native扩展的基本知识 简单来说,我们可以说Native扩展是一组从JavaScript代码调用C++实现的逻辑。...在这一点上,对我们来说,最有趣的是将NodeJS是如何工作的以及它涉及那些部分讲清楚。 重要的是要知道为什么我们可以在NodeJS中使用两种语言(JavaScript和C ++)。...但是,使用NodeJS,我们却可以写入/读取磁盘,对吧?这就是 Native 扩展的关键点。...在新的NodeJS版本中,可能存在可能破坏我们的Native扩展的V8更改。 使用N-API是一种避免此问题的方法。...总之,这是了解NodeJS内部的一种很好的方法。
因为nodejs里很多c++类都继承了async_wrapper.cc里的AsyncWrap类。...然后libuv执行nodejs的c++层回调后,c++层是通过MakeCallback执行js层的回调的。所以我们就可以知道,每次libuv执行上层回调的之后,都会执行next_tick注册的函数。
之前已经分析过了keep-alive,最近在使用nodejs的keep-alive的时候发现了遗漏了一个内容。本文进行一个补充说明。我们先看一下nodejs中keep-alive的使用。 ?...nodejs的setKeepAlive就是做了这两件事情。只不过他只支持修改一个配置。另外测试发现,window下,调用setKeepAlive设置的initialDelay,会修改两个配置。
我们一个个分析。首先看connect。...我们只分析没有调用bind的情况,因为这是最长的链路。我们看一下bind的逻辑。...10 ref/unref 这两个函数设置如果nodejs主进程中只有udp对应的handle时,是否允许nodejs退出。nodejs事件循环的退出的条件之一是是否还有ref状态的handle。...这些都是对操作系统api的封装,就不一一分析。...更多参考 1 通过源码理解IGMP v1的实现(基于linux1.2.13) 2 UDP协议源码解析之接收[1] 3 UDP协议源码解析之发送[2] References [1] UDP协议源码解析之接收
本章本来是《nodejs源码剖析》的一章,由于篇幅有限,已经删除了,所以开放出来(已经同步到github)。相信很多同学也看过该模块的代码。...3 触发事件 分析完事件的订阅,接着我们看一下事件的触发。 1....return this; 61. }; 以上就是events模块的核心逻辑,另外还有一些工具函数就不一一分析。
领取专属 10元无门槛券
手把手带您无忧上云