node 怎么实现 工作队列?

2021-07-10 12:40:39 +08:00
 mutoudaren

用 nodejs 简单的搭建了一个 http sever,可以处理 post 请求,执行比如“job1(post)”,“job2(post)”这样的请求,但是这些不同的 job 只能同步执行,也就是一个执行完了再执行另一个。

所以有没有简单的实现,先把 post 请求存到队列里面,然后依次执行?

5352 次点击
所在节点    Node.js
27 条回复
opentrade
2021-07-10 12:49:40 +08:00
类似 WSGI 的东西吧,Python 的比较多,nodejs 的没用过
dengshen
2021-07-10 13:04:36 +08:00
rx 。流编程
beginor
2021-07-10 13:06:20 +08:00
promise ?
Rrrrrr
2021-07-10 13:14:34 +08:00
事件驱动了解一下?
shiny
2021-07-10 13:21:17 +08:00
Async.js
chenqh
2021-07-10 13:34:49 +08:00
没懂
streamrx
2021-07-10 13:40:42 +08:00
async 不就行了
Sanonz
2021-07-10 14:04:51 +08:00
NemoAlex
2021-07-10 14:24:41 +08:00
usw
2021-07-10 14:32:10 +08:00
桥豆麻袋,“同时执行”和“”产生冲突“具体是啥。async 函数如果没有 await 可咋整
qping
2021-07-10 14:32:41 +08:00
web 请求天然就是异步的,想要搞成同步就把消息存在队列里面,然后另外搞个线程处理这个队列
MegrezZhu
2021-07-10 14:44:20 +08:00
同时执行产生冲突——那冲突的资源是什么? CPU ? IO ?

如果只是想一个个执行的话,post handler 就只接收任务然后加到一个 job queue 里呗,然后自己起一个 worker 一个个拿去执行,这是最 naive 的方法……
debuggerx
2021-07-10 15:03:55 +08:00
听描述 应该是客户端 也就是请求端做串行吧
job1 请求拿到返回了再去执行 job2 请求就好了
lujjjh
2021-07-10 15:05:29 +08:00
muzuiget
2021-07-10 16:19:21 +08:00
把 job 放到一个包成一个 promise,把这些 promise 放到一个数组里,然后一个个 await 这个数组的元素。
Exin
2021-07-10 16:28:19 +08:00
连数组都不需要,最简单的实现如下

```js
let last = Promise.resolve()
onPost(post => last = last.then(() => job(post)))
```
love
2021-07-10 16:50:41 +08:00
我自己的小服务程序也是这样。
收到请求,放在内存中请求列表,同时在硬盘上存一份 JSON 请求,然后另一个 async 函数会循环处理请求列表并删除硬盘上的对应文件。当程序重启时会加载硬盘上的所有请求,以免不小心程序各种原因重启时漏掉队列中的请求。
April5
2021-07-10 17:39:18 +08:00
bull
duan602728596
2021-07-11 10:23:03 +08:00
当初为了实现多文件上传并限制同时上传数,写的一个实现队列的方法,你可以拿去参考参考
https://github.com/duan602728596/Q/blob/main/src/Queue.ts
zbinlin
2021-07-11 14:05:14 +08:00
用 async generator 来实现比较简单

//gist.github.com/zbinlin/541ccb9cf6e9c07f98c7605648c7ea34

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

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

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

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

© 2021 V2EX