我正在创建一个node.js应用程序。它的一个功能是上传一个excel文件,然后读取它并将其内容保存在数据库中。问题是我是node.js的新手,我不理解非阻塞代码的概念,所以看起来这个函数阻塞了主线程,所以我需要一些帮助才能解决这个问题。 / p>
python3 -m memory_profiler profile.py "my_file.txt" n
app.post('/admin/upload_file', function(req, res) {
var sampleFile;
if (!req.files) {
res.send('No files were uploaded.');
console.log('No files were uploaded.');
return;
}
sampleFile = req.files.sampleFile;
var fileArray = sampleFile.name.split('.');
var extension = fileArray[fileArray.length - 1];
if (extension == "xlsx") {
sampleFile.mv('./public/uploads/sample_file.xlsx', function(err) {
if (err) {
res.status(500).send(err);
} else {
var entries = parsing_file(req, res);
if (entries.length > 0) {
for (var i = 0; i < entries.length; i++) {
// this loop on database queries block the main thread
model.insert_in_db(entries[0], function(rows) {});
}
}
res.redirect('/admin');
}
});
} else {
res.redirect('/admin');
}
});
函数解析文件并将值作为对象存储到数组中,当数据库查询的循环(负责在db中插入值)作为主线程启动时,问题就开始了node.js被阻塞,直到循环完成其工作。
答案 0 :(得分:1)
使用fs.readFile从文件中读取数据它是异步操作并使用async.eachLimit而不是for循环它是非阻塞异步操作而for循环是否同步操作
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.time.dal.config.EmailConfig;
public class EmailConfigTest {
@Autowired
EmailConfig emailConfig;
@Value("${smtp_userName}")
private String smtp_userName;
@Value("${forgotPasswordTemplate}")
private String forgotPasswordTemplate;
@Value("${forgotPasswordSubject}")
private String forgotPasswordSubject;
@Test
public void testEmailConfig(){
System.out.println("SMTP User Name is "+smtp_userName);
Assert.assertNotNull(smtp_userName);
}
阅读https://caolan.github.io/async/docs.html#eachLimit异步文档了解更多详情。
答案 1 :(得分:-2)
<强> TL; DR 强>
我不知道insert_in_db
方法的实际实现是什么,但它似乎是一种同步方法。在这种情况下,您的代码实际上被该方法阻止了。
但是在我看来,在数据库中编写异步代码并不是一个好主意,以避免与同时访问同一条记录相关的问题。
简而言之,如果该方法存在阻塞,则必须有理由。