Articles of 事件循环

在NodeJS事件循环中轮询阶段

我正在通过事件循环的节点文档 ,我很困惑。 它说 – timers: this phase executes callbacks scheduled by setTimeout() and setInterval(). I/O callbacks: executes almost all callbacks with the exception of close callbacks, the ones scheduled by timers, and setImmediate(). idle, prepare: only used internally. poll: retrieve new I/O events; node will block here when appropriate. check: setImmediate() callbacks are invoked here. […]

在节点中,如何在当前执行上下文完成时得到通知?

我想跟踪当前执行上下文的结束。 当前执行环境完成后是否会发生任何事件? console.log('starts'); setTimeout(function(){ console.log('set timeout called'); }, 100); // something similar like this process.on('async', function(){ console.log('current execution context finished. event loop going to execute the next one!'); }

检测当前线程是否是libuv默认事件循环的主线程

我正在为Node.js编写一段C代码,并且想要区分asynchronous调用和同步调用。 换句话说,我想要检测我的代码是否在主事件循环中调用的V8事件分派线程上运行,或者是否从某个单独的工作线程调用它。 在前一种情况下,我可以立即调用JavaScript,而在后者中,我必须使用更复杂的asynchronouscallback。 libuv线程API提供了uv_thread_self来标识当前线程,而uv_thread_equal提供了相等的线程比较。 所以我需要find主事件循环的uv_thread_t 。

NodeJS事件循环如何工作?

对于下面的代码, var fs = require('fs'); fs.watch('target.txt', function(event, fileName){ console.log('Event: ' + event + ', for file: ' + fileName); }); Console.log('Now watching target.txt'); 根据以下架构, 1) fs.watch()将调用libuv 。 libuv将启动一个线程来跟踪target.txt上的change事件。 libuv的结果将通过带有数据缓冲区的callbackforms通过NodeJS Bindings进入v8 。 2) libuv在事件队列中添加change事件。 当事件循环selectchange事件时,在v8运行时执行相应的callback。 我的理解是正确的吗?

Node.js:为什么闲置和准备阶段只在内部使用?

node.js的文档描述了其基础事件循环的所谓阶段 。 它明确指出, 空闲和准备阶段只在内部使用 。 对于node.js的事件循环是libuv的循环 ,不用说这些阶段可能映射到libuv的空闲和准备句柄上。 他们将有助于在组织软件任务时获得更大的粒度。 特别是,它们是在执行I / Ocallback和投票阶段之间进行安排的唯一方法。 无论如何,它们不会从底层环境中导出 。 这些阶段被禁止的原因是什么,实际上给用户一个比libuv提供的事件循环显然最差的事件循环? 有没有其他的方式来按上述方式安排任务? 旁注:这只是好奇心。 我曾经与libuv和nodejs一起工作,我注意到了,所以我想知道是否有技术上的原因,或者…这是如何devise的,没有特别的理由。

事件循环阻塞和节点JS中的asynchronous编程

我是节点js编程的新手,因此要非常适当地理解核心概念和实践。 AFAIK节点js具有非阻塞I / O,允许所有磁盘和其他I / O操作以asynchronous方式运行,而JS运行在使用Event Looppipe理资源和执行path的单线程中。 正如许多地方的build议,开发人员build议使用callback模式编写自定义函数/方法 function processData(inputData, cb){ // do some computation and other stuff if (err) { cb(err, null); }else{ cb(null, result); } } callback = function(err, result){ // check error and handle // if not error then grab result and do some stuff } processData(someData, callback) // checking whether execution […]

哪个事件循环阶段执行正常的JavaScript代码

我是node.js的新手,对理解事件循环有点困惑。 据我所知,从https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md ,事件循环阶段只处理setTimeout,setInterval,setImmediate ,process.nextTick,promise和一些I / Ocallback。 我的问题是,如果我有以下代码: for(var i = 0; i <100000000; i ++); 上述代码将在哪个阶段执行?

节点服务器asynchronous调用后端服务

我是Node新手,我正在写我的第一个节点服务器。 在调用后端rest服务之后,它应该通过简单的页面来获得一个简单的获取请求。 我正在使用express来pipe理请求和axios包来作出后端请求。 问题是,服务器阻塞事件循环,我有问题了解如何调用后端asynchronous。 截至目前,前端服务器一次只能pipe理一个请求! 我期望如果后端服务每次都需要10秒的时间来回答,前端服务器可以在10秒内回答两个并发请求,而不是在20秒内。 我错在哪里? 以下是前端节点代码的摘录: app.get('/', function(req, res) { //Making the call to the backend service. This should be asynchronous… axios.post(env.get("BACKEND_SERVICE"), { "user": "some kind of input"}) .then(function(response){ //do somenthing with the data returned from the backend… res.render('homepage'); }) } 这里是后端节点代码的提取: app.post('/api/getTypes', jsonParser, function (req, res) { console.log("> API request for 'api/getTypes' […]

NodeJS事件循环Fundamendals

我相信这是一个常见的问题,但没有find具体的答案。 我有点理解NodeJS的基本概念,它是处理I / O的asynchronous/非阻塞性质。 为了说明起见,我们举一个简单的例子,在节点上写一个执行unix命令find /的HTTP服务器,并将结果写入http响应(因此在用户的浏览器上显示该命令的结果)。 我们假设这需要3秒钟。 假设有两个用户“A”和“B”通过他们的浏览器同时请求。 据我所知用户的请求排队在事件队列(消息A,消息B)。 该消息还具有一个处理完成后执行的相关callback的引用。 由于事件循环是单线程的,并逐个处理事件, 在我上面的例子中,“用户B”的callback触发需要6秒钟吗? [3用于“用户A”的事件处理,3用于它自己的事件处理] 这听起来像我在这里失去了一些东西? 最差的是,如果有100个用户在同一个毫秒内请求? 第100名赛事老板将成为最不幸的用户,必须等待永恒。 据我所知,在运行时只有一个事件队列,上述问题可以适用于应用程序任何部分的任何用户。 例如,网页X中的一个缓慢的数据库查询会减慢网页Y中的不同用户? 从根本上说,我发现串行处理事件和串行执行相关callback的问题。 我在这里错过了什么?

如何cpu密集是太多的node.js(担心阻塞事件循环)

我正在与各个社区编写一个节点应用程序,在这些社区中,用户可以创build和join房间/大厅。 我已经将这些大厅的逻辑写入了节点应用程序本身,但通过大厅对象的集合。 大堂一旦创build,需要一些维护。 用户可以改变大厅内的各种状态,而且我还可以定期(大约每2秒)使用socket.io调用每个大厅,以跟踪一些用户input的“实时”。 这些任务都不是太密集的CPU。 我预见到的最大的潜在威胁是负载分配algorithm,但它不是“实时呼叫”之一,仅在大厅创build者按下button时激活(它也不会在超过10件事情上执行)。 我担心的是,在生产中,如果服务器也开始接近100-200大厅,我可能冒着阻塞事件循环的风险。 我的担心是否合理? 这些操作的潜在数量,尽pipe它们很小,足够大,以将代码卸载到单独的可执行文件中,或者涉及各种frank-thread的JavaScript库吗? TL; DR:节点应用程序具有运行常规小任务的对象。 我应该担心事件循环阻塞,如果这些对象很多。