バックグラウンド処理の途中では Web サーバのリクエストが来ても待機してバックグラウンド処理を実行してないときに Web サーバの処理をしてレスポンス返したい
共有してる変数に Promise を入れてバックグラウンド処理が始まると未解決の Promise をセット
終わったらそれを resolve
リクエストがきたときは 最初にその Promise を await すれば良い
let count = 0
let waiting = null
let lock_count = 0
let resolve = null
const lock = () => {
lock_count++
console.log("LOCK+", lock_count, count)
if(!waiting) {
waiting = new Promise(r => resolve = r)
}
}
const unlock = () => {
lock_count--
console.log("LOCK-", lock_count, count)
if(lock_count === 0) {
resolve()
waiting = null
}
}
const wait = ms => new Promise(r => setTimeout(r, ms))
// バックグラウンド処理
setInterval(async () => {
lock()
await wait(Math.random() * 5000)
count++
unlock()
}, 3000)
// Web サーバ
require("http").createServer(async (req, res) => {
await waiting
res.end(String(count))
}).listen(9123)
コレくらいにシンプルだといいけど Web サーバでリクエストを処理するときに 最初以外のバックグラウンド処理の待機以外で 途中に await が混ざると await 後はまたバックグラウンド処理を始めてる可能性あり
await が入るならリクエスト処理中はバックグラウンド処理を始めないようにバックグラウンド処理側でもリクエスト処理の await 入れたほうが良さそう
ここまで来ると複雑だし いい感じのライブラリ探してそれに任せたほうがいいかも