【发布时间】:2011-11-16 10:55:49
【问题描述】:
什么是阻塞函数或阻塞调用?
这是我在提到 Node.js 或实时处理语言时反复看到的一个术语。
【问题讨论】:
标签: node.js asynchronous real-time terminology blocking
什么是阻塞函数或阻塞调用?
这是我在提到 Node.js 或实时处理语言时反复看到的一个术语。
【问题讨论】:
标签: node.js asynchronous real-time terminology blocking
一个停止脚本执行直到结束的函数。
例如,如果我有一个用我的语言编写的用于写入文件的函数,如下所示:
fwrite(file, "Contents");
print("Wrote to file!");
print 语句只有在文件写入磁盘后才会执行。整个程序在这条指令上暂停。这对于足够小的写入并不明显,但想象一下我有一个巨大的 blob 要写入文件,这需要几秒钟:
fwrite(file, blob);
print("Wrote to file!");
print 语句只会在写入几秒钟后执行,而整个程序将在这段时间内停止。在 Node.js 中,这些工作是异步完成的,使用事件和回调。我们的例子会变成:
fwrite(file, blob, function() {
print("Wrote to file!");
});
print("Do other stuff");
其中第三个参数是文件写入后要调用的函数。位于 write 函数之后的 print 语句将在之后立即调用,无论文件是否已被写入。因此,如果我们要编写一个足够大的 blob,输出可能如下所示:
Do other stuff
Wrote to file!
这使得应用程序非常快速,因为您无需等待客户端消息、文件写入或其他。您可以继续以并行方式处理数据。这是 Node.js 的许多优势之一。
【讨论】:
阻塞调用是在返回到调用线程之前不允许处理继续进行的调用——这也称为同步调用。另一方面,异步意味着线程(和代码)可以同时(并发)执行。
【讨论】:
var block = function _block() {
while(true) {
readInputs();
compute();
drawToScreen();
}
}
阻塞函数基本上是永远计算的。这就是阻塞的意思。
其他阻塞函数会等待 IO 发生
非阻塞 IO 系统意味着一个函数启动一个 IO 操作,然后进入空闲状态,然后在发生 IO 操作的结果时处理它。
基本上就是线程空闲和休眠的区别。
【讨论】: