这是我的第一个问题。
我有此代码:
const work = async () => {
const file = new lineByLine(filename);
let line;
while (line = file.next()) {
const worker = await getIdleWorker()
worker.assign({documentId: line.toString()})
worker.work()
}
}
// todo: I need time for resolve other promises meanwhile this is executed.
const getIdleWorker = async () => {
while (true) {
for (let i = 0; i < workers.length; i++) {
const worker = workers[i]
if (worker.isReady()) {
return worker;
}
// Solution: give time to resolve other promises.
await sleep(10).milliseconds();
}
}
}
worker.work方法将属性running
设置为true,执行一项工作,准备好后,将同一属性running
更改为false。同时,getIdleWorker()搜索具有该属性running
为false的工作程序,该方法永远等待直到找到空闲的工作程序为止。
我想问题是永远找不到空闲的工作程序,因为诺言worker.work永远不会得到解决,因为主线程卡在了getIdleWorker中。
哪个是解决此类问题的最佳解决方案?我不在乎是否必须完全更改设计。
谢谢!
答案 0 :(得分:0)
此实现应该可以正常工作,它每秒检查一次空闲的工作程序,如果找到了它,则将该工作程序返回。
const getIdleWorker = () => {
return new Promise(resolve => {
const findFreeWorker = () => {
for (let i = 0; i < workers.length; i++) {
const worker = workers[i]
if (worker.isReady()) {
return worker;
}
}
return null
}
const searchFor = setInterval(() => {
const freeWorker = findFreeWorker()
if (freeWorker) {
clearInterval(searchFor)
resolve(freeWorker)
}
}, 1000)
})
}
问题是while (true) {
阻塞了事件循环,因此Node.js一直被永久执行那段代码,添加async
试图仅返回Promise,但是代码在无限循环。
Here,您可以找到一篇不错的文章,以更好地了解Node.js的异步模式