【问题标题】:is my code blocking node thread是我的代码阻塞节点线程
【发布时间】:2016-06-22 06:36:47
【问题描述】:

我对 nodejs 有一些困惑,希望得到一些帮助。我有一张名为 camps、contacts 和 camp_contact 的表。我必须根据用户所属的阵营显示联系人列表。我使用 async 循环遍历营地,将其保存在用户会话中,然后从 mysql 中获取数据。

        var array_myData = [];
    async.each(req.session.user.camps, function(camps, callback) {

        database.getConnection(function(err, connection) {
          // Use the connection

            connection.query('SELECT contacts.*, contact_camp.* '+
            ' FROM contacts JOIN contact_camp '+
            ' ON contact_camp.contact_id = contacts.id '+
            ' WHERE contact_camp.camp_id = ?',
                [camps.camp_id], function(err,data){

                if(err) {
                    //this will call the err function
                  callback('error');

                }
                else {
                    array_myData = array_myData.concat(data);
                    callback();

                }
                connection.release();
          });

        });
        //final function call.
    }, function(err){
        // if any error happened, this function fires.
        if( err ) {
          // All processing will now stop.

        } else {

          res.render('contacts',
                {
                  page
                });
        }
    });

代码运行良好。现在我想知道的是,使用 array.concat 会阻塞线程吗?如果是这样,我该如何改变呢?我阅读并根据我的理解,不是异步的 I/O 操作会阻塞线程,比如从文件或数据库中读取。有这样的数组var array = ['a','b', 'c'] 并循环遍历它会阻塞线程吗?

最后,有没有办法知道我写的代码是否阻塞了线程?因为每次编写自己的函数时我都会担心。

当使用如下回调创建函数时,我也会感到困惑:

function test(param, fn) { do something; fn(); }

我不确定这种没有定时器的函数是否会阻塞线程。

【问题讨论】:

  • 一切都会阻塞线程(除非它在 ​​javascript 之外,例如等待对第 3 方服务/服务器的请求完成),重要的是 多长时间阻塞线程。所以,是的,循环遍历一个数组会阻塞线程,它阻塞线程多长时间以及它是否有害取决于它循环的项目数量以及循环中发生的事情。与 array.concat 相同。
  • 有多少项目,取决于用户将输入多少项目。有没有更好的解决方法?我不知道如何将 concat 与我的代码异步使用。
  • 除非您遇到性能问题,否则您在这里所做的是premature optimization
  • 你会如何组合两个数组? concat 专门用于此目的,因此使用它是有意义的。您可以使用 for 循环,但根据引擎优化的内容,它的性能可能会降低。它会更工作/更复杂。
  • .concat 根本不是资源密集型的。除非您每秒处理成千上万个请求,否则我不会担心(在这种情况下,您可能希望研究实例化多个服务器)

标签: node.js


【解决方案1】:

好的,如果它对您有所帮助:

我翻阅了一下,据我了解,非异步的 I/O 操作会阻塞线程,例如从文件或数据库中读取。

在 NodeJS 中,对文件描述符的操作是异步的 => 非阻塞

文件描述符是:

  • 数据库操作,
  • 打开/关闭文件
  • 网络运营

例如:

fs.readFile('<pathToTheFile>', (err, data) => {
  if (err) throw err;
  console.log(data);
});
// if your file is very big, until it is read, maybe other requests will be finished

有这样的数组 var array = ['a','b', 'c'] 并循环遍历它会阻塞线程吗?

是的,它会阻塞线程,但是这样的操作不是资源密集型的。 NodeJs 是一种事件驱动语言(单线程),但在多线程或多进程语言中,内核线程仍然会被此类操作阻塞 => 相同的事情......这可能是题外话。

// if you do something like this
while(true){
function test(param, fn) { do something; fn(); }
}
// you will see that you just blocked the thread

我不确定这种没有定时器的函数是否会阻塞线程

通常你会将该函数放在一个错误处理程序中,如果你没有做一个无限的while,它不应该阻塞线程。

try{}catch(err){
// do something with the error
}

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多