在node.js应用程序中阻塞函数

时间:2017-03-16 15:12:56

标签: javascript node.js multithreading asynchronous

我正在创建一个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被阻塞,直到循环完成其工作。

2 个答案:

答案 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方法的实际实现是什么,但它似乎是一种同步方法。在这种情况下,您的代码实际上被该方法阻止了。

但是在我看来,在数据库中编写异步代码并不是一个好主意,以避免与同时访问同一条记录相关的问题。

简而言之,如果该方法存在阻塞,则必须有理由。