'are listening on\n'); rs.push('3000 and 4000\n'); rs.push(null); rs.pipe(process.stdout); 执行结果: 在这段代码中...(别忘了文章前面提到的“所有的流都属于 EventEmitter 的实例”)来实现消耗处理 —— 在首次监听其 data 事件后,readStream 便会持续不断地调用 _read(),通过触发 data...当数据全部被消耗时,则触发 end 事件。...write 方法的 callback 回调参数会在 chunk 被消费后(从缓存中移除后)被触发;end 方法的 callback 回调参数则在 Stream 结束时触发。...end”事件之前被触发,而且会清空缓存数据并结束 Stream。
在这段代码中,我们通过 readStream.push(data) 的形式往可读流里注入数据,并以 readStream.push(null) 来结束可读流。...(别忘了文章前面提到的“所有的流都属于 EventEmitter 的实例”)来实现消耗处理 —— 在首次监听其 data 事件后,readStream 便会持续不断地调用 _read(),通过触发 data...当数据全部被消耗时,则触发 end 事件。...write 方法的 callback 回调参数会在 chunk 被消费后(从缓存中移除后)被触发;end 方法的 callback 回调参数则在 Stream 结束时触发。...end”事件之前被触发,而且会清空缓存数据并结束 Stream。
nodejs中使用实现了stream.Readable接口的对象来将对象数据读取为流数据,所有这些对象都是继承了EventEmitter类的实例对象,在读取数据的过程中,会触发各种事件。...接口的对象可能会触发的事件有: readable事件,当可以从流中读出数据时触发 data事件,当读取到来自文件、客户端、服务器端等对象的新的数据时触发,常见的有创建服务器监听客户端请求数据时的req.on...方法,用于通知对象恢复触发data事件 pipe方法,用于设置一个数据通道,然后取出所有流数据并将其输出到通道另一端所指向的目标对象中 unpipe方法,用于取消在pipe方法中设置的通道 unshift...ReadStream对象的open事件,在该事件触发时调用的回调函数可以使用一个参数,参数值是被打开文件的文件描述符(也即文件句柄fd)。...WriteStream对象的open事件,在该事件触发时调用的回调函数可以使用一个参数,参数值是被打开文件的文件描述符(也即文件句柄fd)。
我们很难在某个 Nodejs 应用中找到直接使用 stream 模块的代码,比如 const stream = require('stream') 但是我们一定很熟悉这样的代码。.../index.html', 'utf8', (err, data) => { res.end(data) }) }).listen(3000) 这段代码和前面例子的区别在于,读取文件的方式。...Stream 类在 legacy.js 中创建 Stream 类继承了 events,使其拥有了 events 的事件监听能力。...4) 消费流的时候会读取缓冲区的数据,缓冲区数据被消耗完之后会再次触发 onreadable 事件。 read()方法会从内部缓冲区中拉取并返回若干数据,没有更多可用数据时,会返回null。...为什么要有 Stream? 在计算机处理任务的过程中,通常会把数据加载到内存中,但是内存空间是有限的。
如果说可以继续写入事件到流时会触发 drain 事件,也是在 dest.write(chunk) 等于 false 时,如果 ondrain 不存在则注册 drain 事件。...== null); } 2.2.4 触发 data 事件 调用 readable 的 resume() 方法,触发可读流的 'data' 事件,进入流动模式。...设置的为 0),将会触发实例上的 _read() 方法,之后会在触发 data 事件。...state.reading) { stream.read(0); } ... } 2.2.5 订阅 end 事件 end 事件:当可读流中没有数据可供消费时触发,调用 onend 函数...function onend() { debug('onend'); dest.end(); } } 2.2.6 触发 pipe 事件 在 pipe 方法里面最后还会触发一个 pipe
当调用父进程中的 subprocess.disconnect() 或子进程中的 process.disconnect() 后会触发 disconnect 事件。...当出现无法创建进程,无法kill进程和向子进程发送消息失败的时候都会触发error事件。 当子进程结束后时会触发exit事件。 当子进程的 stdio 流被关闭时会触发 close 事件。...注意,close事件和exit事件是不同的,因为多个进程可能共享同一个stdio,所以发送exit事件并不一定会触发close事件。...事件,当子进程使用process.send() 发送消息的时候就会被触发。...子进程将会在message事件中,将该handle传递给Callback函数,从而可以在子进程中进行处理。
在child_process模块中,可以同步创建进程也可以异步创建进程。同步创建方式只是在异步创建的方法后面加上Sync。 创建出来的进程用ChildProcess类来表示。...当调用父进程中的 subprocess.disconnect() 或子进程中的 process.disconnect() 后会触发 disconnect 事件。...当出现无法创建进程,无法kill进程和向子进程发送消息失败的时候都会触发error事件。 当子进程结束后时会触发exit事件。 当子进程的 stdio 流被关闭时会触发 close 事件。...注意,close事件和exit事件是不同的,因为多个进程可能共享同一个stdio,所以发送exit事件并不一定会触发close事件。...子进程将会在message事件中,将该handle传递给Callback函数,从而可以在子进程中进行处理。
原生HTTP服务器 学习过Nodejs的朋友肯定对下面这段代码非常熟悉: const http = require('http'); let server = http.createServer((req...上面这段代码还有一种更加清晰的等价形式,代码如下: let server = new http.Server(); server.on("request", function(req, res){ //...}); server.listen(3000); 首先创建了一个HttpServer的实例,对该实例进行request事件监听,server在3000端口进行监听。...HttpServer继承与net.Server,它使用http_parser对连接的socket对象进行解析,当解析完成http header之后,会触发request事件,body数据继续保存在流中,...直到使用data事件接收数据。
通常,在执行代码时,事件循环最终将到达轮询 poll 阶段,在该阶段它将等待传入的连接,请求等。...,事件先触发 可以看到,注册事件监听器前,事件先触发,则该事件会直接被忽略。...可以通过监听data事件的方式消耗可读流。 在首次监听其data事件后,readable便会持续不断地调用_read(),通过触发data事件将数据输出。...第一次data事件会在下一个tick中触发,所以,可以安全地将数据输出前的逻辑放在事件监听后(同一个tick中)。 当数据全部被消耗时,会触发end事件。...在end方法调用后,当所有底层的写操作均完成时,会触发finish事件。 Duplex 创建可读可写流。 Duplex实际上就是继承了Readable和Writable的一类流。
: false, // 错误事件已发送 emitClose: true, // 流销毁时,是否发送close事件 autoDestroy: true, // 自动销毁,在'end'事件触发后被调用...示例代码: readable....'事件回调中调用read方法读取数据) } 2.4.6. pause 将流从流动模式转变为暂停模式,停止触发 'data' 事件,将所有的数据保存到缓冲区 readable.pause Readable.prototype.pause...,缓冲区里没有数据会触发 'data' 事件;否则将数据保存到缓冲区根据 needReadable 状态触发 'readable' 事件 read: 读 length=0 长度的数据时,buffer 中的数据已经到达...hwm 或者溢出需要触发 'readable' 事件;从 buffer 中读取数据并触发 'data' 事件 resume: 有 'readable' 监听,该方法不起作用;否则将流由暂停模式转变为流动模式
它消除了在采取行动之前等待整个数据源可用的需要。 为什么要使用流? 流提供了与其他数据处理方法相比的两个关键优势。 内存效率 使用流,处理前不需要将大量数据加载到内存中。...可读流以小块方式从文件中读取数据。 我们将事件处理程序附加到可读流上以处理不同的事件。当数据块可供读取时,会触发 data 事件。当可读流完成从文件中读取所有数据时,会触发 end 事件。...如果在读取过程中发生错误,则会触发 error 事件。 通过使用可读流并监听相应的事件,您可以高效地从源(例如文件)中读取数据,并对接收到的数据块执行进一步操作。...我们将事件处理程序附加到可写流上,以处理不同的事件。当可写流完成写入所有数据时,会触发 finish 事件。如果在写入过程中发生错误,则会触发 error 事件。...writableStream.on('error', (err) => { console.error('An error occurred during compression:', err); }); 在这段代码片段中
按照官方的API文档,步骤如下: 在您的子类中扩充适合的父类。...(例如util.inherits(MyTransform, Transform); ) 在您的构造函数中调用父类的构造函数,以确保内部的机制被正确初始化。...下面介绍Readable流有以下几种事件 1. 'Readable'事件 2. 'data'事件 - 数据正在传递时,触发该事件(以chunk数据块为对象) 3....'end'事件 - 数据传递完成后,会触发该事件。 4. 'close'事件 5. 'error'事件 所有这些事件都可以在官方API文档中找到例子。 C....值得注意的是,默认情况下,当数据传送完毕,触发'end'事件时,会同时触发目标(可写流)的'end'事件,导致目标不再可写。
二、定时器触发方式 对于服务器而言,驱动服务程序业务逻辑的事件包括网络事件、定时事件、以及信号事件;定时器触发形式通常有两种: 网络事件和定时事件在一个线程中处理;例如:nginx、redis、memcached...网络事件和定时事件在不同线程中处理;例如:skynet。 2.1、网络事件和定时事件在一个线程中处理 网络事件和定时事件可以进行协同处理;即网络事件和定时事件在一个线程中处理。...其他代码 } // ... 其他代码 2.1.1、为什么可以协同处理? (1)epoll对事件的处理是通过epoll_ctl()添加事件,在epoll_wait()检测IO就绪进行异步处理事件。...其他代码 2.2、网络事件和定时事件在不同线程中处理 定时任务在通过一个单独的线程检测,利用usleep()/sleep()检测触发定时器,定时器事件的处理由其他线程或运行队列执行。...这种接口一般应用于网络事件和定时事件在一个线程中处理的触发方式。 (5)更新检测定时器。 (6)清除定时器。
执行上面代码时,流会逐次调用fs.read,将文件中的内容分批取出传给下游。 在文件看来,它的内容被分块地连续取走了。 在下游看来,它收到的是一个先后到达的数据序列。...一旦在执行read(n)时检测到这个条件,便会触发end事件。 当然,这个事件只会触发一次。 Readable事件 在调用完_read()后,read(n)会试着从缓存中取数据。...在数据到达后,流是通过readable事件来通知消耗方的。 在此种情况下,push方法如果立即输出数据,接收方直接监听data事件即可,否则数据被添加到缓存中,需要触发readable事件。...首次监听readable事件时,还会触发一次read(0)的调用,从而引起_read和push方法的调用,从而启动循环。 总之,在暂停模式下需要使用readable事件和read方法来消耗流。...这个方法会在下一个tick中触发readable事件,同时再调用flow(),从而形成流动。 state.length不为0。
在Dubbo整个框架中,codec2的可选值为dubbo、thrift,本文将重点分析Dubbo协议的编码解码。...DecodeResult.NEED_MORE_INPUT在解码过程中如果收到的字节流不是一个完整包时,结束此次读事件处理,等待更多数据到达, SKIP_SOME_INPUT:忽略掉一部分输入数据。...代码@1:对buffer做一个简单封装,返回ChannelBufferOutputStream实例。 代码@2:根据序列化器,将通道的URL进行序列化,变存入buffer中。...代码@4:获取响应状态码。 代码@5:如果是心跳事件,则直接调用readObject完成解码即可。...代码@6:获取decode.in.io的配置值,默认为true,表示在IO线程中解码消息体,如果decode.in.io设置为false,则会在DecodeHanler中执行(受Dispatch事件派发模型影响
因此使用read(0)可以完成一些比较巧妙的事情,如在readable处理函数中可以使用read(0)触发下一次readable事件,可选的操作读缓冲区。...那么,什么情况下会触发readable事件呢?...这样,对于Readable的实现者,一旦在_read函数插入有效数据到读缓冲区,都会触发readable事件,在paused状态下,设置readable事件处理函数并手动执行read函数,便可完成数据的读取...而同时Writeable开始刷新写缓冲区,刷新完毕后异步触发drain事件,在该事件处理函数中,设置Readable为flowing状态,并继续执行flow函数不停的刷新读缓冲区,这样就完成了pipe限流...在Readable的pipe方法中,涉及到了Writeable的drain事件。该事件的触发意味着写缓冲区已可以继续缓存数据,可见drain事件与写缓冲区严格相关。
可读流是对数据消费的抽象,nodejs中可读流有两种工作模式:流式和暂停式,流式就是有数据的时候就会触发回调,并且把数据传给回调,暂停式就是需要用户自己手动执行读取的操作。...true; // 是否需要触发readable事件 this.needReadable = false; // 是否触发了readable事件 this.emittedReadable...this.destroyed = false; // 数据编码格式 this.defaultEncoding = options.defaultEncoding || 'utf8'; // 在管道化中...事件,则触发readable事件 if (state.needReadable) emitReadable(stream); } // 继续读取数据,如果可以的话 maybeReadMore...2 用户从可读流获取数据 用户可以通过read函数或者监听data事件来从可读流中获取数据 Readable.prototype.read = function(n) { n = parseInt(
② 在_read方法中,通过调用push(data)将数据放入可读流中供下游消耗。 ③ 在_read方法中,可以同步调用push(data),也可以异步调用。...(即readable便会持续不断地调用_read(),通过触发data事件将数据输出) 在 paused 模式下,必须显式调用 stream.read() 方法来从流中读取数据片段。...readable.pause() 方法将会使 flowing 模式的流停止触发 'data' 事件, 进而切出 flowing 模式。任何可用的数据都将保存在内部缓存中。...⑤ 在end方法调用后,当所有底层的写操作均完成时,会触发finish事件。...但是当writable将缓存清空时,会触发一个drain事件,再调用readable.resume()使上游进入流动模式,继续触发data事件。
B站(乐哥聊编程)有完整配套视频,免费观看 为什么Redis是单线程?...,当客户端准备好接受响应数据时,就会触发AE_WRITABLE事件,执行关联的命令回复处理器的程序,执行对应的套接字写入操作,当数据写入完毕,就会将客户端套接字的AE_WRITABLE事件和命令回复处理器解绑...完整的客户端与服务端交互流程 1.server初始化后,在serversocket上注册AE_READABLE事件,并与连接应答处理器关联 2.客户端请求与服务端建立连接,server收到AE_READABLE...事件,通过事件分发处理器,找到关联的连接应答处理器,执行应答程序,并且注在客户端的socket上注册AE_READABLE事件,并与命令请求处理器关联 3.客户端发起命令请求,如set a 1,server...会收到AE_READABLE事件,通过事件分发处理器,找到关联的命令请求处理器,在内存中执行命令,并在client的套接字上注册AE_WRITABLE事件,并与命令回复处理器绑定 4.客户端告诉server
领取专属 10元无门槛券
手把手带您无忧上云