settimeout正在阻塞事件循环Nodejs检查下一个示例:
settimeout is blocking event-loop Nodejs check the next example:
帮助我。这是代码:
var start = Date.now();
setTimeout(function () {
console.log(Date.now() - start);
for (var i = 0; i < 1000000000; i++){}
for (var i = 0; i < 1000000000; i++){}
}, 1000);
setTimeout(function () {
console.log(Date.now() - start);
}, 2000);
当在REPL或节点服务器中运行此代码时,显示的消息不是正确的。显示的消息是:1000和3188-->这是问题所在,因为这将是10002000。为什么第二个console.log命令延迟执行??如何在nodejs中管理Timers??
在NODEJS中:如果我需要在第一个任务前2秒触发一个任务,那么我该怎么做呢。
Node.js中的JavaScript执行仍然是单线程的。只要for
循环使该线程繁忙,第二个function
和console.log()
就必须等待。
John Resig在"JavaScript定时器的工作原理"中对定时器做了很好的解释
如果我需要在第一个任务前2秒触发一个任务,那么我该怎么做呢。
您可以将运行时间较长的同步任务(在本例中为for
循环)移动到自己的模块中,并使用child_process.fork()
来执行它
// long-running.js
var start = Number(process.argv[2]);
for (var i = 0; i < 1000000000; i++){}
for (var i = 0; i < 1000000000; i++){}
console.log('3', Date.now() - start);
var child_process = require('child_process');
var start = Date.now();
setTimeout(function () {
console.log('1', Date.now() - start);
child_process.fork('./long-running', [start]);
}, 1000);
setTimeout(function () {
console.log('2', Date.now() - start);
}, 2000);
// output
1 1013
2 2016
3 3395
这是因为代码不是并行的,setTimeout函数会将代码添加到队列中,并在可能的时候执行。
MDN说:
延迟是指函数调用应该延迟。实际延迟可能更长
相关文章:
- 滚动到容器中的下一个元素-几乎到了
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 使用ajax将数据从一个步骤发送到下一个步骤的3步表单
- AngularJS&JSON-从Previous&下一个对象
- 使用向下箭头键(与tab键一样)聚焦下一个输入
- 来自文档或下一个静态父级的事件委派
- angularjs移除焦点上的活动类并添加到下一个项目
- 使用Jquery查找下一个特定类,并检查它是否有其他类
- 检查具有活动类的元素,然后向下滑动其下方的下一个元素
- 如何检查下一个索引是否存在 - LODASH
- settimeout正在阻塞事件循环Nodejs检查下一个示例:
- 在执行上一个的处理程序之前检查下一个事件以隐藏自动完成
- 如果不使用JavaScript跳到下一个,请检查数组元素是否存在
- 如何检查下一个存在的字符串中的字符在javascript
- jQuery:检查下一个元素是否存在
- 网页:按钮检查自己(HTML页面)和打开下一个HTML页面按字母顺序位于同一文件夹
- 如何在React中检查上一个值和下一个值的差异
- 检查下一个元素是否具有特定的类
- 如何检查下一个td是否在一个tr空或不使用jQuery