我不是Node程序员,但我对单线程非阻塞IO模型的工作原理感兴趣.在我阅读了文章理解-node-js-event-loop之后,我真的很困惑.它给出了该模型的一个例子:
c.query(
'SELECT SLEEP(20);',
function (err, results, fields) {
if (err) {
throw err;
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<html><head><title>Hello</title></head><body><h1>Return from async DB query</h1></body></html>');
c.end();
}
);
Run Code Online (Sandbox Code Playgroud)
这是一个问题.当有两个请求A(至上)和B,由于只有一个线程,服务器端程序将处理请求的第一:做SQL查询这是一个睡眠声明站立I/O等待.并且程序停留在I/O等待,并且无法执行呈现网页的代码.程序会在等待期间切换到请求B吗?在我看来,由于单线程模型,没有办法从一个请求切换另一个请求.但是示例代码的标题说"除了代码之外,所有内容都是并行运行".(PS我不确定我是否误解了代码,因为我从未使用过Node.)节点如何在等待期间切换到B?你能用一种简单的方法解释Node的单线程非阻塞IO模型吗?如果你能帮助我,我将不胜感激.:)
由于JavaScript在单个线程中运行,在发出AJAX请求后,后台实际发生了什么?我想更深入地了解这一点,任何人都可以解释一下吗?
如何创建非阻塞异步函数?以下是我想要实现的,但我的程序仍在阻止......
var sys = require("sys");
function doSomething() {
sys.puts("why does this block?");
while(true);
}
setTimeout(doSomething,0);
setTimeout(doSomething,0);
setTimeout(doSomething,0);
sys.puts("main");
Run Code Online (Sandbox Code Playgroud) 寻找同步和异步递归函数的特定实现,这些函数可以用作将未来递归函数转换为平面迭代的起点.
以下是递归函数的两个示例:同步和异步.
我正在寻找的是使用没有递归的堆栈的实现.
例如,它可能会像这样工作:
var output = syncStack(myRecursiveFunctionTurnedIterative, [])
Run Code Online (Sandbox Code Playgroud)
或者,如果那是不可能的,那么只需使用堆栈重新实现下面的两个函数,这应该是一个足够好的开始.例如
var stack = []
function circularReferences(object, references, stack) {
var output = {}
if (object.__circularid__) return true
Object.defineProperty(object, '__circularid__', { value: id++ })
for (var key in object) {
var value = object[key]
if (value && typeof value == 'object') {
console.log(value)
stack.push(???)
circularReferences()
stack.pop()
if (is) output[key] = '[Circular]'
} else {
output[key] = value
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题的原因是,多年来我一直在努力学习如何做到这一点,但从未找到过(a)容易记住如何做的系统,以及(b)实用的系统.
我有一个节点脚本,它应该利用单个节点进程可以获得的所有CPU资源.但我发现setInterval太慢了.
当然,我在文档中发现了这一点:
当延迟大于2147483647或小于1时,延迟将设置为1.
来源:https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args
现在我想知道是否有办法进一步减少限制,或者是否有可以使用的替代功能.
我不能只使用普通循环,因为还有其他需要同时运行的异步事件.
编辑:
再次:我不能只使用普通循环,因为还有其他需要同时运行的异步事件.我不确定为什么这么难理解.
正常循环正在运行时,您将阻止其他所有操作的执行.如果将循环放在另一个异步执行的函数中并不重要.
这是什么意思?
我们来看一些例子:
setInterval(()=>{console.log('a')},1000) // asynchronous thing that needs to run in the background
while (true) {
// do whatever
}
Run Code Online (Sandbox Code Playgroud)
这段代码会做什么?它会阻止一切.console.log('a')不会连续执行.
setInterval(()=>{console.log('a')},1000) // asynchronous thing that needs to run in the background
setTimeout(()=>{
while (true) {
// do whatever
}
}, 1)
Run Code Online (Sandbox Code Playgroud)
一旦while循环开始,这也将阻止间隔的执行.
我有以下问题.我已经在其构造函数中创建了一个类,我正在加载几个图像,我需要延迟剩余的初始化,直到它们被完全加载.我使用的代码如下(摘自构造函数):
var self = this;
var imagesToLoad = 4;
var finishInit = function() {
alert(imagesToLoad);
imagesToLoad--;
if (imagesToLoad == 0) {
// remaining initializations
}
}
this._prevIcon = new Image();
this._prevIcon.onload = finishInit;
this._prevIcon.src = "img1.png";
this._nextIcon = new Image();
this._nextIcon.onload = finishInit;
this._nextIcon.src = "img2.png";
this._pauseIcon = new Image();
this._pauseIcon.onload = finishInit;
this._pauseIcon.src = "img3.png";
this._playIcon = new Image();
this._playIcon.onload = finishInit;
this._playIcon.src = "img4.png";
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,执行时显示的对话框在Firefox 7中读取4,4,4,4和在IE 9中读取4,3,2,4.我很困惑因为我认为JS是单线程的,因此是一个事件处理程序不应该打断另一个.捕获(或我的错误)在哪里?
提前致谢.此致,Tomek
我对下面的代码有一个奇怪的问题:在函数调用之后添加一个无限循环将阻止在调用内部解决承诺。
我不明白为什么,以及这个循环如何影响承诺行为
const second_call = () => {
return new Promise((resolve, reject) => {
console.log("Second call");
resolve();
});
}
const first_call = () => {
console.log("First call");
second_call().then(() => {
console.log("First call, THEN");
});
}
const main = () => {
console.log("Started");
first_call();
//if if comment the while (true), all debug msgs will be displayed
//if i uncomment the while (true), the msg "First call, THEN" will not be displayed
while (true);
}
main();
Run Code Online (Sandbox Code Playgroud) 那段代码发生了什么
var start = new Date();
setTimeout(function() {
var end = new Date();
console.log('Time elapsed with func1:',end - start, 'ms');
}, 500);
setTimeout(function() {
var end = new Date();
console.log('Time elapsed with func2:',end - start, 'ms');
}, 250);
while (new Date() - start < 1000) {}
Run Code Online (Sandbox Code Playgroud)
日志:
Time elapsed with func2: 1001 ms
Time elapsed with func1: 1017 ms
Run Code Online (Sandbox Code Playgroud)
我预计 func1 将首先被触发,因为它是要添加到事件队列中的第一个事件。然后,由于JS的单线程特性,等到func1返回后再执行队列中的下一个事件func2。
那么,发生了什么?
javascript ×5
node.js ×5
asynchronous ×2
algorithm ×1
events ×1
loops ×1
promise ×1
recursion ×1
setinterval ×1