Node.js 使用大量数据解析promise时阻止事件循环
我在kubernetes环境中运行NodeJS,我的应用程序不会因为未响应的活动性探测而被kubernetes杀死/重新启动。例如,我必须确保事件循环未被阻止 特别是,我正在使用解析(有时是巨大的)CSV文件。我正在从Minio流式传输数据,并使用PapaParseNode.js 使用大量数据解析promise时阻止事件循环,node.js,promise,blocking,event-loop,Node.js,Promise,Blocking,Event Loop,我在kubernetes环境中运行NodeJS,我的应用程序不会因为未响应的活动性探测而被kubernetes杀死/重新启动。例如,我必须确保事件循环未被阻止 特别是,我正在使用解析(有时是巨大的)CSV文件。我正在从Minio流式传输数据,并使用PapaParsestep函数逐行解析数据。在这里之前没问题 最后,使用resolve返回解析后的数据。完成此操作后,将根据返回数据的大小阻止事件循环。我不明白为什么 const parseCSVfromMinio = async (filename)
step
函数逐行解析数据。在这里之前没问题
最后,使用resolve
返回解析后的数据。完成此操作后,将根据返回数据的大小阻止事件循环。我不明白为什么
const parseCSVfromMinio = async (filename) => {
const data = await minioClient.getObject(
process.env.BUCKET_NAME,
filename,
);
return new Promise((resolve, reject) => {
const result = { meta: {}, data: [] };
papaParse.parse(data, {
complete: () => {
resolve(result);
},
error: (err) => {
reject(err);
},
step: (results) => {
// gets CSV data row by row
result.data.push(results.data);
result.meta = results.meta;
},
});
});
};
编辑:似乎被阻止在会导致错误的假设。当使用静态数据和无
async
时,阻塞会转移到代码的另一个(更合理的)部分。如果库不提供任何异步解析CSV的方法,则应考虑将源代码作为流逐行读取和解析。这将限制解析,并允许Kubernetes的健康检查呼叫得到快速响应。您不应使用getObject
,papaParase和其他库支持可读流。你想把minio/s3文件作为一个可读的流传送到papaparse中,然后把它的输出传送到其他地方,这样就不会有任何东西能解析整个文件或者在内存中了。我完全同意使用流。在这种特殊情况下,我需要在继续之前验证整个数据。我在解析数据时没有问题,但在解析时没有问题。如果我写一个console.log('Finished')代码>在resolve()
之前,我可以看到它,然后事件循环被阻塞几秒钟。为什么会发生这种情况是我的主要问题@BenjaminGruenbaum您能否详细说明一下为什么getObject
不作为流返回(如文档中所述)?