libuv

Can a setImmediate() function scheduled in an I/O callback recalculate timeout for other I/O notifications?

萝らか妹 提交于 2021-02-11 12:12:43
问题 There is the poll stage of the Node js's event loop. Its aim is to blockingly wait for I/O notifications and then execute needed callbacks. A timeout time of the waiting is calculated before entering this stage. If there were operations scheduled through setImmediate than the timeout is set at 0, if timers took place than timeout is set with a view of them and if there are no such impediments the blocking would continue "forever". What will happen if the timeout is initially set at "infinity"

Node.js架构剖析

梦想与她 提交于 2021-02-02 11:57:13
原文链接: http://www.ayqy.net/blog/node-js-architecture-overview/ 一.Node.js 缔造的传奇 I have a job now, and this guy is the reason why I have that now. His hobby project is what I use for living. Thanks. —— Shajan Jacob 2009 年 Ryan Dahl 在 JSConf EU 大会上推出了 Node.js,最初是希望能够通过异步模型突破传统 Web 服务器的高并发瓶颈,之后愈渐发展成熟,应用越来越广,出现了繁荣的 Node.js 生态 借助 Node.js 走出浏览器之后,JavaScript 语言也 一发不可收拾 : Any application that can be written in JavaScript, will eventually be written in JavaScript. —— Jeff Atwood (摘自 The Principle of Least Power ) 早在 2017 年,NPM 就凭借茫茫多的社区模块成为了 世界上最大的 package registry ,目前模块数量已经 超过 125 万 ,并且仍在快速增长中(每天新增900多个

What is the exact handling of the NodeJS Event Loop?

∥☆過路亽.° 提交于 2021-01-29 15:03:50
问题 I know that NodeJS Event Loop collects Tasks from Event Queue and transfers control to the callback of the Task. When the task is completed, the Task transfers control from Event Loop. Therefore, I think that actually returning the callback is an Event Loop that has received control right from the Task. Is this the right idea? Also, if the assumption is correct about the blocking phenomenon that can occur in the Event Loop, if there is a delayed asynchronous task, can the event loop process

Rust FFI, callbacks, and lifetimes

≡放荡痞女 提交于 2021-01-29 08:34:02
问题 I'm trying to build a nice rust wrapper around libuv, an event loop library written in C. I'm pretty much "done", but I'm having some trouble with callbacks and lifetimes. Being an event loop library, libuv relies heavily on callbacks. I have some code that can accept functions, closures, or a tuple of (obj, method-on-obj) and it handles creating an appropriate "trampoline" to get that across the FFI boundary. That all works. However, the problem I'm running into is that I cannot figure out

深入浅析Node.js单线程模型

最后都变了- 提交于 2021-01-05 02:39:45
Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1、高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实现复杂的交互逻辑。 而事实上,大多数网站的服务器端都不会做太多的计算,它们只是接收请求,交给其它服务(比如从数据库读取数据),然后等着结果返回再发给客户端。因此,Node.js针对这一事实采用了单线程模型来处理,它不会为每个接入请求分配一个线程,而是用一个主线程处理所有的请求,然后对I/O操作进行异步处理,避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。 2、事件循环 Node.js 在主线程中维护了一个事件队列,当接收到请求后,就将请求作为一个事件放入该队列中,然后继续接收其他请求。当主线程空闲时(没有请求接入时),就开始循环事件队列,检查队列中是否有要处理的事件,这时要分两种情况:如果是非I/O任务,就亲自处理,并通过回调函数返回到上层调用;如果是I/O任务

通过源码理解http层和tcp层的keep-alive

佐手、 提交于 2020-12-31 06:04:45
前言:最近在研究websocket和keep-alive。而websocket涉及到长连接,过多无用的长连接对系统来说是负担,是否可以尽快发现对端是否已经掉线,从而释放这个连接来减少系统压力呢,就这个初衷,通过wireshark和nodejs调试一下心跳机制。引发了一些研究和思考。 我们知道建立tcp连接的代价是比较昂贵的,每次连接需要三次握手,还有慢开始,或者建立一个连接只为了传少量数据等都影响了效率。这时候如果能保持连接,那会大大提高效率。但是如果一直保持连接,又没有数据或者有一端已经断网则会浪费资源,如何做到一个相对的取舍呢?本文通过源码来分析一下关于keep-alive的原理。读完本文,相信你会对这个问题有更多的理解。本文分成两个部分 1 http层的keep-alive 2 tcp层的keep-alive 1 http层的keep-alive 最近恰好在看nginx1.17.9,我们就通过nginx来分析。我们先来看一下nginx的配置。 keepalive_timeout timeout; keepalive_requests number; 上面两个参数告诉nginx,如果客户端设置了connection:keep-alive头。nginx会保持这个连接多久,另外nginx还支持另外一个限制,就是这个长连接上最多可以处理多少个请求。达到阈值后就断开连接

nginx1.17.9源码分析之线程池

偶尔善良 提交于 2020-11-24 06:57:49
我们发现事件驱动的软件都得配一个线程池。libuv和nginx都是。因为事件驱动的软件是单线程。但是有些事情总会引起线程阻塞。所以这个事情就不能放到主线程里做。这就是为什么事件驱动都要配一个线程池。把任务交给线程池中的线程。主线程继续执行。任务完成后通知主线程或者执行回调就行。 我们先看一下nginx线程池的架构。然后开始分析。 在这里插入图片描述 线程池模块在nginx里属于核心模块。在nginx初始化的时候。会初始化一个保存线程池配置的结构体(见图)。nginx默认开启四个线程池。 static void * ngx_thread_pool_create_conf ( ngx_cycle_t *cycle) { ngx_thread_pool_conf_t *tcf; tcf = ngx_pcalloc(cycle->pool, sizeof ( ngx_thread_pool_conf_t )); if (tcf == NULL ) { return NULL ; } if (ngx_array_init(&tcf->pools, cycle->pool, 4 , sizeof ( ngx_thread_pool_t *)) != NGX_OK) { return NULL ; } return tcf; } 上面的函数就是构造出文章开头的那个图的结构。创建了保存配置的结构

这一次,彻底弄懂 JavaScript 执行机制

时间秒杀一切 提交于 2020-11-24 03:33:46
不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了:我难道不知道js是一行一行执行的?还用你说?稍安勿躁,正因为js是一行一行执行的,所以我们以为js都是这样的: let a = '1' ; console .log(a); let b = '2' ; console .log(b); 然而实际上js是这样的: setTimeout( function ( ) { console .log( '定时器开始啦' ) }); new Promise ( function ( resolve ) { console .log( '马上执行for循环啦' ); for ( var i = 0 ; i < 10000 ; i++){ i == 99 && resolve(); } }).then( function ( ) { console .log( '执行then函数啦' ) }); console .log( '代码执行结束' ); 依照js是按照语句出现的顺序执行这个理念,我自信的写下输出结果: //"定时器开始啦" //"马上执行for循环啦" //

这一次,彻底弄懂 JavaScript 执行机制

青春壹個敷衍的年華 提交于 2020-11-24 03:30:43
△ 是 新朋友 吗?记得先点 web前端学习圈 关注我哦~ 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了:我难道不知道js是一行一行执行的?还用你说?稍安勿躁,正因为js是一行一行执行的,所以我们以为js都是这样的: let a = '1'; console.log(a); let b = '2'; console.log(b); 然而实际上js是这样的: setTimeout(function(){ console.log('定时器开始啦') }); new Promise(function(resolve){ console.log('马上执行for循环啦'); for(var i = 0; i < 10000; i++){ i == 99 && resolve(); } }).then(function(){ console.log('执行then函数啦') }); console.log('代码执行结束'); 依照 js是按照语句出现的顺序执行

使用 ASP.NET Core 作为 mediasoup 的信令服务器

↘锁芯ラ 提交于 2020-10-24 18:59:20
一、概述 (图片来源:李超) mediasoup 的服务端由两部分构成: 1、使用 C++ 编写的作为子进程的媒体层 ( ICE , DTLS , RTP 等)。可执行文件在 Linux 或 macOS 上为 mediasoup-worker ,在 Windows 上为 mediasoup-worker.exe 。 2、使用 Javascript ( Typescript ) 编写的、基于 Node.js 的用于与 mediasoup-worker 进行通信的组件。因为官方或几乎所有第三方的 mediasoup 服务端都是使用的是 Node.js 来实现,所以官方提供一个中间层让开发者不直接和 mediassoup-workder 交互。 本文主要讨论如何使用 ASP.NET Core 替换 Javascript(Node.js) 的实现。 (备注:由于是在参考图基础上 PS 的,不太准确,有心情了再改吧。) 二、进程及进程间通信:Node.js 版 1、Node.js 的 spawn 和 libuv uv_spawn(fork/exec) libuv 和 V8 是 Node.js 的基石,而 mediasoup-worker 也使用了 libuv。 在 Node.js 程序中,安装 mediasoup 的模块时会将 mediasoup-worker 会自动编译在 node