是我的代码阻塞节点线程

时间:2016-06-21 17:12:39

标签: node.js

我对nodejs有一些困惑,希望得到一些帮助。我有一张叫做营地,联系人和camp_contact的桌子。我必须根据用户所属的阵营显示联系人列表。我使用异步循环遍历营地,我在用户会话中保存,然后从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(); }

我不确定这种没有计时器的功能是否会阻塞线程。

1 个答案:

答案 0 :(得分:0)

好的,如果它以某种方式帮助你:

  

我阅读并根据我的理解,非异步的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是一种事件驱动的语言(单线程),但是,在多线程或多进程语言中,内核线程仍然会被这样的操作阻止=&gt;同样的事情......这可能是偏离主题的。

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

我不确定这种没有计时器的功能是否会阻塞线程

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

try{}catch(err){
// do something with the error
}
相关问题