gpt4 book ai didi

javascript - 带有 ImageMagick 的 Node.js,为什么服务器没有被阻止?

转载 作者:搜寻专家 更新时间:2023-10-31 23:47:23 27 4
gpt4 key购买 nike

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

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

理解和问题如下图:

enter image description here

请帮助我确保我对上述node.js单线程的理解,以及问题:

  1. 当线程 1 将任务委托(delegate)给 ImageMagick 时,该线程是否空闲以供新请求使用?

编辑

  1. 图像并非 100% 正确。 ImageMagick 的委托(delegate)和回调也应该通过事件循环,一个 Node 应用程序只有一个事件循环(我的理解,有人可以确认吗?)。

  2. node-s3-uploader 作者的回答:https://github.com/Turistforeningen/node-s3-uploader/issues/64

最佳答案

虽然 ImageMagick 看起来是同步的,但它不是。 ImageMagick(和使用 im-resize 的 s3-uploader)产生一个子进程(使用 child_process.exec)来执行处理,因此它不会阻塞进程。

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

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

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

进一步阅读:

关于javascript - 带有 ImageMagick 的 Node.js,为什么服务器没有被阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com