什么是阻塞函数?

12

什么是阻塞函数阻塞调用

这个术语在涉及Node.js或实时处理编程语言时经常出现。

3个回答

22

一个将脚本执行暂停直到其结束的函数。

例如,如果我有一个在我的语言中用于写入文件的函数,像这样:

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");

第三个参数是一个函数,一旦文件被写入后就会被调用。无论文件是否已经被写入,紧跟在写入函数后面的print语句都会立即被调用。因此,如果我们要写入足够大的数据块,则输出可能如下所示:

Do other stuff
Wrote to file!

这使得应用程序非常快速,因为您不必等待客户端消息、文件写入或其他操作。您可以以并行方式继续处理数据。这被许多人认为是 Node.js 的优点之一。


3
var block = function _block() {
  while(true) {
    readInputs();
    compute();
    drawToScreen();
  }
}

阻塞函数基本上会一直运算下去,这就是所谓的阻塞。

其他阻塞函数会等待IO操作发生。

非阻塞IO系统意味着一个函数开始一个IO操作,然后进入空闲状态,当IO操作完成时处理IO操作结果。

这基本上是线程空闲和休眠之间的区别。


0
阻塞性调用是指在返回给调用线程之前不允许处理继续的调用 - 这也称为同步调用。异步则意味着线程(和代码)可以同时执行(并发)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接