У меня есть скрипт, который использует 2 класса, скажем, класс A
и класс B
.Класс A
содержит массив экземпляров класса B
, часто не менее 20. Класс B
выполняет вычислительно дорогостоящие и медленные задачи, став узким местом родительского процесса.Функция async
может быть здесь ответом, но она все еще работает только в текущем процессе, используя память, которая может понадобиться остальной части процесса, а их 20, что складывается.После некоторых исследований многопоточности в узле я натолкнулся на идею использования многопроцессного подхода: каждый экземпляр Class B
будет иметь свою собственную память и будет полностью отделен от родительского процесса, проблема заключается в связи между родительским процессом.и ребенок.Очевидно, что есть STDIO, но при его использовании в Node используется поток, что означает, что такие операции, как
ClassAInstance.ClassBArray[0].getItem
, вернут неопределенное значение, поскольку getItem
не является свойством потока.
Проксиможет быть решением.
const B = new Proxy(class B {
// some class that defines functions performing expensive tasks
}, {
get(target, prop) {
return new Promise(resolve => {
target.stream.write(`get ${prop}`);
target.stream.on('message', resolve(message));
});
}
});
Это будет работать, за исключением того, что ссылка на любое свойство вернет обещание, изменяя всю структуру исходного скрипта.
Было бы вполне возможно изменить архитектурусценария, чтобы приспособиться к этому изменению, однако кажется, что нужно приложить немало усилий, чтобы вызвать недовольство, так как порождение слишком большого количества дочерних процессов может значительно замедлить работу компьютера пользователя.Если бы кто-нибудь мог предложить возможный обходной путь или совершенно другой подход, это было бы очень признательно.