Node.js 是我的代码阻塞节点线程
我对nodejs有些困惑,希望得到一些帮助。我有一张名为camps,contacts和camp_contact的表格。我必须根据用户所属的营地显示联系人列表。我使用async在camps中循环,保存在用户会话中,然后从mysql中获取数据Node.js 是我的代码阻塞节点线程,node.js,Node.js,我对nodejs有些困惑,希望得到一些帮助。我有一张名为camps,contacts和camp_contact的表格。我必须根据用户所属的营地显示联系人列表。我使用async在camps中循环,保存在用户会话中,然后从mysql中获取数据 var array_myData = []; async.each(req.session.user.camps, function(camps, callback) { database.getConnection(
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']
并在其中循环是否会阻塞线程
最后,有没有办法知道我写的代码是否阻塞了线程?因为每次我写自己的函数时,我都会担心
当用户创建带有回调的函数时,我也会感到困惑,如:
函数测试(param,fn){do something;fn();}
我不确定这种没有计时器的函数是否会阻塞线程。好的,如果它能帮助您: 我四处阅读,根据我的理解,非异步的I/O操作会像从文件或数据库读取一样阻塞线程 在NodeJS中,对文件描述符的操作是异步=>非阻塞的 文件描述符将是:
- 数据库操作
- 打开/关闭文件
- 网络运营
try{}catch(err){
// do something with the error
}
好吧,如果这对你有帮助的话: 我四处阅读,根据我的理解,非异步的I/O操作会像从文件或数据库读取一样阻塞线程 在NodeJS中,对文件描述符的操作是异步=>非阻塞的 文件描述符将是:
- 数据库操作
- 打开/关闭文件
- 网络运营
try{}catch(err){
// do something with the error
}
所有东西都会阻塞线程(除非它在javascript之外,比如等待对第三方服务/服务器的请求完成),重要的是它阻塞线程的时间有多长。因此,是的,在数组上循环将阻止线程,它阻止线程的时间有多长,以及它是否有害,取决于它循环了多少项以及循环中发生了什么。与array.concat相同。多少项取决于用户将随时间输入多少项。有更好的办法吗?我不知道如何在我的代码中异步使用concat。除非您看到性能问题,否则您在这里所做的就是。否则您将如何组合两个阵列?concat专门用于此目的,因此使用它是有意义的。您可以使用for循环,但它的性能可能会降低,这取决于引擎优化的内容。这将是一项更复杂的工作。
。concat
完全不是资源密集型的。除非您每秒处理10到数千个请求,否则我不会担心(在这种情况下,您可能希望查看多个服务器的实例)所有内容都会阻塞线程(除非它在javascript之外,例如等待对第三方服务/服务器的请求完成),重要的是它阻塞线程的时间。因此,是的,在数组上循环将阻止线程,它阻止线程的时间有多长,以及它是否有害,取决于它循环了多少项以及循环中发生了什么。与array.concat相同。多少项取决于用户将随时间输入多少项。有更好的办法吗?我不知道如何在我的代码中异步使用concat。除非您看到性能问题,否则您在这里所做的就是。否则您将如何组合两个阵列?concat专门用于此目的,因此使用它是有意义的。您可以使用for循环,但它的性能可能会降低,这取决于引擎优化的内容。这将是一项更复杂的工作。。concat
完全不是资源密集型的。除非您每秒处理10到数千个请求,否则我不会担心(在这种情况下,您可能需要研究实例化多个服务器)
try{}catch(err){
// do something with the error
}