-2

我在服务器上运行 node.js 代码,想知道它是否阻塞。这有点类似于:

function addUserIfNoneExists(name, callback) {
    userAccounts.findOne({name:name}, function(err, obj) {
        if (obj) {
            callback('user exists');
        } else {

            // Add the user 'name' to DB and run the callback when done.
            // This is non-blocking to here.
            user = addUser(name, callback)

            // Do something heavy, doesn't matter when this completes.
            // Is this part blocking?
            doSomeHeavyWork(user);
        }
    });
};

一旦addUser完成,doSomeHeavyWork函数就会运行并最终将某些内容放回数据库中。这个函数需要多长时间并不重要,但它不应该阻塞服务器上的其他事件。

这样,是否可以测试 node.js 代码是否最终阻塞?

4

2 回答 2

1

一般来说,如果它连接到另一个服务,如数据库或 Web 服务,那么它是非阻塞的,您需要进行某种回调。但是,任何函数都会阻塞,直到返回一些东西(即使什么都没有)......

如果该doSomeHeavyWork函数是非阻塞的,那么您使用的任何库都可能允许某种回调。所以你可以编写函数来接受这样的回调:

var doSomHeavyWork = function(user, callback) {
  callTheNonBlockingStuff(function(error, whatever) { // Whatever that is it likely takes a callback which returns an error (in case something bad happened) and possible a "whatever" which is what you're looking to get or something.
    if (error) {
      console.log('There was an error!!!!');
      console.log(error);
      callback(error, null); //Call callback with error
    }
    callback(null, whatever); //Call callback with object you're hoping to get back.
  });
  return; //This line will most likely run before the callback gets called which makes it a non-blocking (asynchronous) function. Which is why you need the callback.
};
于 2013-07-10T00:24:42.450 回答
1

您应该避免在 Node.js 代码同步块的任何部分中不调用系统或 I/O 操作并且计算需要很长时间(在计算机意义上),例如迭代大数组。而是将这种类型的代码移动到单独的工作程序或使用 process.nextTick() 将其划分为更小的同步部分。您可以在此处找到 process.nextTick() 的解释,但也可以阅读所有评论。

于 2013-07-10T10:37:15.457 回答