【发布时间】:2012-03-10 21:26:45
【问题描述】:
Node 新手的理解是,如果我重写同步或内联代码以利用函数/回调,我可以确保我的代码是非阻塞的。我很好奇这在事件堆栈方面是如何工作的。这里的简单示例:Don't understand the callback - Stackoverflow 是这将阻止:
var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();
虽然这不会:
callback = function(post){
doSomethingWithPost(post)
}
db.query("select * from posts where id = 1",callback);
doSomethingElse();
好的,我知道我们应该使用回调。但就事件堆栈而言,为什么这样做? Javascript 是单线程的。在第一个示例行中,使用了昂贵且阻塞的 I/O 操作。在第一行完成之前,第 2 行无法执行。这是因为第 2 行需要来自第 1 行的信息吗?还是因为 I/O 事件只是从根本上阻塞操作,这意味着它们会夺取控制权并且在完成之前不会将其归还......
在第二个示例中,昂贵的 I/O 已移至函数中,现在我们有一个回调函数。当然,回调在 I/O 完成之前无法执行。这不会改变。因此,执行 1 和 2 所需的时间差异主要是如果第二个请求到达服务器会发生什么。
如果第二个请求命中示例一,由于阻塞操作,它在请求 1 完成之前无法处理.. 但在示例二中.. 将操作移动到函数中会自动生成子进程或充当多线程?如果 JavaScript 是单线程的,这仍然会造成问题,除非有某种方式进行并行处理。如果我们使用子进程等非阻塞技术,函数/回调是否只保证是非阻塞的。 .
【问题讨论】:
标签: node.js nonblocking