使用ImageMagick的Node.js,为什么服务器没有被阻止?

时间:2015-12-01 10:48:04

标签: javascript node.js

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

我在项目中使用了 S3-uploader lib并使用两台设备对其进行测试,同时上传和调整图片大小,我发现服务器确实没有被一个请求阻止虽然cpu使用率几乎是100%,响应大约需要3000ms才能完成(它只是一个AWS EC2 t2.micro实例)。

理解和问题如下图所示:

enter image description here

请帮助我确保我对上面的node.js单线程的理解和问题:

  1. 当线程1将任务委托给ImageMagick时,新来的请求是否可以免费使用该线程?
  2. 修改

    1. 图片不是100%正确。来自ImageMagick的委托和回调也应该通过Event Loop和节点应用程序只有一个Event循环(我的理解,任何人都可以确认?)。

    2. 来自node-s3-uploader作者的回复
    3. https://github.com/Turistforeningen/node-s3-uploader/issues/64

1 个答案:

答案 0 :(得分:3)

虽然ImageMagick可能看似同步,但事实并非如此。 ImageMagick(以及使用im-resize的s3-uploader)生成子进程(使用child_process.exec)以执行处理,因此它不会阻止进程。

至于你服务器上实际发生了什么,我从你的描述中假设你在微实例上运行ImageMagick。结果是,当您的进程 时,表示事件循环未被阻止,事件正在处理(问题1),而可以处理其他请求(问题) 2),ImageMagick正在处理你的图像,并使用尽可能多的CPU。反过来,这会占用CPU,这会减慢你的应用程序。

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

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

进一步阅读: