У меня такая ситуация:
const q1 = async.queue((task,cb) => task(cb), 1);
const q2 = async.queue((task,cb) => task(cb), 3);
В основном, ситуация такова: если я могу получить блокировку на q1, я могу обрабатывать до 3 вещей одновременно в q2.Ака, большинство вещей в моей программе должны работать последовательно, но, конечно, все может работать параллельно, но только если они сначала получат «блокировку» на q1.Тем не менее, написание этого оказывается гораздо сложнее, чем ожидалось.Я думаю, что это похоже на проблему блокировки чтения / записи.https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
Другими словами, я могу обрабатывать вещи только в q2, если у меня есть блокировка на q1.Одна из проблем с реализацией этого заключается в том, что если мне всегда придется получать блокировку на q1 в критической секции q2, то я не смогу использовать более высокий уровень параллелизма в q2, он всегда будет последовательным.
Единственная идея, которая у меня есть сейчас, это перевернуть логическое значение, что-то вроде этого:
let q2HasLock = false;
if(q2hasLock === true){
q2.push(cb => ...);
}
else{
q1.push(cb => ...);
}
, тогда я могу использовать это:
q2.drain = () => {
q2HasLock = false;
};
, но остальная часть - это яне знаю, как / когда перевернуть q2HasLock
на true
.Надеюсь, вы понимаете проблему / идею.Другая проблема, связанная с этой реализацией, заключается в том, что запросы на передачу в q2 могут привести к истощению запросов, идущих в q1, поэтому я мог бы сделать это:
let q2HasLock = false, count = 0 ;
if(q2hasLock === true && count < 3){
count++;
q2.push(cb => ...);
}
else{
q1.push(cb => ...);
}
q2.drain = () => {
count = 0;
q2HasLock = false;
};
Это становится проблематично - я хотел бы реализовать это какнасколько возможно!