Javascript Node.js和ImageMagick,为什么服务器没有被阻止?

Javascript Node.js和ImageMagick,为什么服务器没有被阻止?,javascript,node.js,Javascript,Node.js,据说Node.js代码是单线程,不应该处理一些cpu密集型任务,如图像大小调整,这些任务应该委托给其他程序,如ImageMagick或其他第三方服务: 我在我的项目中使用了S3 uploader,并使用两台设备同时上传和调整图像大小进行了测试,我发现服务器确实没有被他们的一个请求阻塞,尽管cpu使用率几乎为100%,响应大约需要3000毫秒才能完成(它只是一个AWS EC2 t2.micro实例) 理解和问题如下图所示: 请帮助我确保我理解上述node.js单线程,并回答以下问题: 当线程1将

据说Node.js代码是单线程,不应该处理一些cpu密集型任务,如图像大小调整,这些任务应该委托给其他程序,如ImageMagick或其他第三方服务:

我在我的项目中使用了S3 uploader,并使用两台设备同时上传和调整图像大小进行了测试,我发现服务器确实没有被他们的一个请求阻塞,尽管cpu使用率几乎为100%,响应大约需要3000毫秒才能完成(它只是一个AWS EC2 t2.micro实例)

理解和问题如下图所示:

请帮助我确保我理解上述node.js单线程,并回答以下问题:

  • 当线程1将任务委托给ImageMagick时,该线程是否可以被新的请求自由使用
  • 编辑

  • 图像不是100%正确。ImageMagick的委托和回调也应该通过事件循环进行,节点应用程序只有一个事件循环(据我所知,任何人都可以确认)

  • node-s3-uploader作者的回答:


  • 虽然ImageMagick看起来可能是同步的,但事实并非如此。ImageMagick(和使用im resize的s3 uploader)生成一个子进程(使用
    child\u process.exec
    )以执行处理,因此它不会阻止该进程

    至于服务器上实际发生了什么,根据您的描述,我假设您正在micro实例上运行ImageMagick。结果是,虽然您的进程是空闲的,这意味着事件循环没有被阻止,并且事件正在被处理(问题1)并且可以处理其他请求(问题2),但ImageMagick正在做它在处理图像中的一部分,并且使用尽可能多的CPU。这反过来会占用CPU,从而降低应用程序的速度

    这是一种具有讽刺意味的冲突:为了释放线程,您正在启动一个单独的进程,但该进程实际上窃取了所有可用的CPU

    在这种情况下,最佳做法不是在服务器上本地执行繁重的处理,而是为任务委派单独的CPU,无论是运行处理服务的实例、lambda函数还是任何其他适合您的解决方案

    进一步阅读:


    您的代码如何与ImageMagick交互?如何触发调整大小?在不同的服务器上?或者使用亚马逊Lambda?是的。EventLoop届时将是免费的。图像处理由imagemagick外部完成,如果图像具有更高的分辨率,这可能是cpu使用率高的原因。@Quentin,使用node-s3-uploader。@Danfrom Germany,在图像上载(通过multer)后,在同一服务器上使用node-s3-uploader进行图像大小调整。酷,我认为升级可以解决部分高cpu使用率的问题,对吗?虽然我觉得现在我正在使用AWS,但我应该使用Amazon Lambda服务。谢谢!也许现在正是时候,但你回答的第一句话让我有点困惑;希望澄清一下能有所帮助。用于调整图像大小,这将创建一个子进程(有趣的是,使用)。你剩下的答案似乎很正确。是的,我倾向于同意Lambda可能是最佳实践@非常感谢!接得好,这是个打字错误。我的意思是“产生子进程”。更正:)