使用RxJS处理调度程序,每秒检查作业数组。作业完成后,将从阵列中删除。我想用 .mergeAll(并发)参数运行它,例如,只有两个作业同时运行。 目前我有一个可以看到的解决方法here。
我正在尝试的是
Observable
.interval(1000)
.timeInterval()
.merge(...jobProcesses.map(job => Observable.fromPromise(startJob(job.id))))
.mergeAll(config.concurrency || 10)
.subscribe();
这显然不起作用。任何帮助将不胜感激。
答案 0 :(得分:1)
从评论中看来,你似乎只是试图限制并发性,而这种间隔的东西只是绕道而行。你应该能够得到你需要的东西:
const Rx = require('rxjs/Rx')
let startTime = 0
const time = () => {
if (!startTime)
startTime = new Date().getTime()
return Math.round((new Date().getTime() - startTime) / 1000)
}
const jobs = new Rx.Subject() // You may additionally rate-limit this with bufferTime(x).concatAll()
const startJob = j => Rx.Observable.of(undefined).delay(j * 1000).map(() => time())
const concurrency = 2
time()
jobs
.bufferCount(concurrency)
.concatMap(buf => Rx.Observable.from(buf).flatMap(startJob))
.subscribe(x => console.log(x))
Rx.Observable.from([3, 1, 3]).subscribe(jobs)
// The last job is only processed after the first two are completed, so you see:
// 1
// 3
// 6
请注意,这在技术上并没有挤出最大可能的并发数,因为它会将作业分成不变的批次。如果您的作业处理时间非常不均匀,则批处理中最长的作业将延迟从下一批处理中拉出作业。