Javascript Node.js和ImageMagick,为什么服务器没有被阻止?
据说Node.js代码是单线程,不应该处理一些cpu密集型任务,如图像大小调整,这些任务应该委托给其他程序,如ImageMagick或其他第三方服务: 我在我的项目中使用了S3 uploader,并使用两台设备同时上传和调整图像大小进行了测试,我发现服务器确实没有被他们的一个请求阻塞,尽管cpu使用率几乎为100%,响应大约需要3000毫秒才能完成(它只是一个AWS EC2 t2.micro实例) 理解和问题如下图所示: 请帮助我确保我理解上述node.js单线程,并回答以下问题: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将
虽然ImageMagick看起来可能是同步的,但事实并非如此。ImageMagick(和使用im resize的s3 uploader)生成一个子进程(使用
child\u process.exec
)以执行处理,因此它不会阻止该进程
至于服务器上实际发生了什么,根据您的描述,我假设您正在micro实例上运行ImageMagick。结果是,虽然您的进程是空闲的,这意味着事件循环没有被阻止,并且事件正在被处理(问题1)并且可以处理其他请求(问题2),但ImageMagick正在做它在处理图像中的一部分,并且使用尽可能多的CPU。这反过来会占用CPU,从而降低应用程序的速度
这是一种具有讽刺意味的冲突:为了释放线程,您正在启动一个单独的进程,但该进程实际上窃取了所有可用的CPU
在这种情况下,最佳做法不是在服务器上本地执行繁重的处理,而是为任务委派单独的CPU,无论是运行处理服务的实例、lambda函数还是任何其他适合您的解决方案
进一步阅读: