蓝鸟承诺在自然界中是否阻塞
Are bluebird promises blocking in nature
对于 promises 尤其是 bluebird 的基本功能,我可能有点陌生。我想要完成的是一个 API 服务器,它处理将 250K+ 行批量写入数据库。完成请求大约需要 30 秒。我希望 API 服务器根据批量写入的成功 return 正常或错误。当我不使用承诺时,我没有机会冒出错误,因为请求没有等待批量写入完成。但是,如果我使用 promise,错误和成功将正常工作。但是在操作完成之前,服务器变得没有响应。简而言之,使用 promise 库处理批量写入会阻塞 API 服务器。
function chunk(arr, chunkSize) {
var R = [];
for (var i=0,len=arr.length; i<len; i+=chunkSize)
{
R.push(arr.slice(i,i+chunkSize));
}
return promise.resolve(R);
}
exports.add = function(req, res) {
var PO_STD_LT_TIME = 90; //DAYS
Parts.sync()
.then(function() {
return Parts.destroy({
where: {}
});
})
.then(function() {
var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx');
var sheet_name_list = workbook.SheetNames;
var JSON_S = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
var size = 40000;
chunk(JSON_S, size).then(function(JSON_Small) {
promise.each(JSON_Small, function (JSON_small_){
Parts.bulkCreate(JSON_small_)
.catch(function(err) {
res.json(500, {
Error: "Error : " + err
});
})
}).finally(ext_fns.handleResult(res,200))
})
})
}
处理此问题的最佳方法是什么?我是否以正确的方式使用承诺?
这是因为您一直在调用同步行为。罪魁祸首是
var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx');
您应该在 XLSX
模块上使用相当于 fs.readFile
, which is asynchronous. Alternatively, since you're using bluebird, you can use promisifyAll
的 XLSX:
var Promise = require('bluebird')
var fs = Promise.promisifyAll(/* the XLSX module */)
这将允许您将所有 XLSX 模块视为承诺。
这是一个提示。
最近在 io.js (NodeJS) 中添加了一个同步 io 标志。获取最新版本并使用 --trace-sync-io
运行。它会找出你所有的同步阻塞问题——我怀疑它们与承诺无关。
至于蓝鸟 - 它没有阻塞。
对于 promises 尤其是 bluebird 的基本功能,我可能有点陌生。我想要完成的是一个 API 服务器,它处理将 250K+ 行批量写入数据库。完成请求大约需要 30 秒。我希望 API 服务器根据批量写入的成功 return 正常或错误。当我不使用承诺时,我没有机会冒出错误,因为请求没有等待批量写入完成。但是,如果我使用 promise,错误和成功将正常工作。但是在操作完成之前,服务器变得没有响应。简而言之,使用 promise 库处理批量写入会阻塞 API 服务器。
function chunk(arr, chunkSize) {
var R = [];
for (var i=0,len=arr.length; i<len; i+=chunkSize)
{
R.push(arr.slice(i,i+chunkSize));
}
return promise.resolve(R);
}
exports.add = function(req, res) {
var PO_STD_LT_TIME = 90; //DAYS
Parts.sync()
.then(function() {
return Parts.destroy({
where: {}
});
})
.then(function() {
var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx');
var sheet_name_list = workbook.SheetNames;
var JSON_S = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
var size = 40000;
chunk(JSON_S, size).then(function(JSON_Small) {
promise.each(JSON_Small, function (JSON_small_){
Parts.bulkCreate(JSON_small_)
.catch(function(err) {
res.json(500, {
Error: "Error : " + err
});
})
}).finally(ext_fns.handleResult(res,200))
})
})
}
处理此问题的最佳方法是什么?我是否以正确的方式使用承诺?
这是因为您一直在调用同步行为。罪魁祸首是
var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx');
您应该在 XLSX
模块上使用相当于 fs.readFile
, which is asynchronous. Alternatively, since you're using bluebird, you can use promisifyAll
的 XLSX:
var Promise = require('bluebird')
var fs = Promise.promisifyAll(/* the XLSX module */)
这将允许您将所有 XLSX 模块视为承诺。
这是一个提示。
最近在 io.js (NodeJS) 中添加了一个同步 io 标志。获取最新版本并使用 --trace-sync-io
运行。它会找出你所有的同步阻塞问题——我怀疑它们与承诺无关。
至于蓝鸟 - 它没有阻塞。