Альтернатива для обёртки STDIO в узле - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть скрипт, который использует 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));
        });
    }
});

Это будет работать, за исключением того, что ссылка на любое свойство вернет обещание, изменяя всю структуру исходного скрипта.

Было бы вполне возможно изменить архитектурусценария, чтобы приспособиться к этому изменению, однако кажется, что нужно приложить немало усилий, чтобы вызвать недовольство, так как порождение слишком большого количества дочерних процессов может значительно замедлить работу компьютера пользователя.Если бы кто-нибудь мог предложить возможный обходной путь или совершенно другой подход, это было бы очень признательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...