请教大家在 NodeJS 里如何处理比较耗时的任务

65 天前
 subtleworks

大家好

我用 Express 搭建了一个服务器 有的请求会处理一些非常耗时的任务 可能会持续几分钟到几十分钟不等

通常会先返回给前端告知任务正在处理 然后会在请求里调用处理这个任务的方法

我发现耗时短的任务会很快执行完 但耗时长的就会中断进行 并且如果同时还有其他的任务进来 就都会中断执行

我对 Express 和 Node.js 的认知都很浅 但描述给 GPT 也是答非所问 所以请教大家如何解决这个问题

谢谢

2185 次点击
所在节点    Node.js
32 条回复
darklinden
64 天前
* 使用 async 丢命令行异步给其他程序执行
* napi-rs 写个 node 插件异步执行

node 本身计算性能极其拉垮, 不要让它干重活, 只搞 io 就行
subtleworks
64 天前
@lisongeee 好的 谢谢回复
subtleworks
64 天前
@darklinden 现在确实是 async 然后 call 了另一个方法也是 js 写的异步执行 后面莫名其妙它就会执行到一半停止 因为有看到 progress 停留在中间不再改变 不知道是不是没有用队列的原因
chenshiforever
64 天前
async 怎么会中断呢,,你用 gpt 检查下你代码逻辑错误
lee88688
64 天前
把耗时任务扔到 worker 里面看看呢。node 可以搜一下 worker_thread 文档,创建和使用比较简单。
subtleworks
64 天前
@lee88688 好的 谢谢 我去看下
zhangyuang
64 天前
让后台用其他语言写然后用 ffi 来调用 https://github.com/zhangyuang/node-ffi-rs
libook
64 天前
业务上做成异步化,就是用户提交请求之后,服务器记录这个请求到消息队列,然后立即返回给用户处理中的信息,用户此时可以去干别的,过一会可以在特定界面查看人物结果。

服务上就是一个负责与用户交互的服务,一个消息队列用于记录任务,一个负责从队列里读出任务并进行处理的集群服务。集群服务处理完每个任务就会把结果塞到数据库里供交互服务查询,或者重新塞到另一个消息队列里让下游的服务消费。
subtleworks
64 天前
@libook 谢谢建议 结合以上其他人的回复 我也觉得应该用队列实现 然后你的回复从集群开始 我没有看懂了
libook
64 天前
@subtleworks #29 队列的概念里有生产者和消费者,就是生产者服务往队列里塞任务,消费者服务从队列里拿任务出来执行。

我所说的集群也可以是一个服务,就是消费者,考虑到你的任务可能执行时间很长,所以我建议是用很多个服务组成的集群一起消费队列里的任务。

你去找些消息队列相关的文章看看应该就了解了。
wanguorui123
64 天前
再开个工作线程
任务分片
subtleworks
64 天前
@libook 好的 谢谢解释!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1031152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX