Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用大量数据解析promise时阻止事件循环_Node.js_Promise_Blocking_Event Loop - Fatal编程技术网

Node.js 使用大量数据解析promise时阻止事件循环

Node.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)

我在kubernetes环境中运行NodeJS,我的应用程序不会因为未响应的活动性探测而被kubernetes杀死/重新启动。例如,我必须确保事件循环未被阻止

特别是,我正在使用解析(有时是巨大的)CSV文件。我正在从Minio流式传输数据,并使用PapaParse
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
不作为流返回(如文档中所述)?