Заходим в каталог /workers, проект разделен на 3 файла (хотя, все можно было бы написать и в одном, но мы делаем так для нашего удобства):
multicore.js- это запускаемый модуль, запускаем такnode multicoremaster.js- модуль, который запускается в родительском процессеworker.js- модуль, который запускается в дочернем процессе
Запускаем 'node multicore', который подгружает сначала master.js и происходит порождение дочерних процессов по количеству ядер процессора os.cpus().length при помощи cluster.fork(), ссылки на воркеры складываются в массив workers. Родительский процесс рассылает дочерним через worker.send() задачу на исполнение. Дочерний процесс ловит задачу (это массив) и перемножает все его элементы на 2, после чего отправляет результат обратно в родительский процесс. Когда родительский процесс получает ответы от всех дочерних, то он выходит, завершая и дочерние.
Заходим в каталог /tcpServer. Тут лежит пример передачи объекта из адресного пространства одного процесса, в адресное пространство другого при помощи протокола TCP/IP и сокетов операционной системы, API которых обернуто в библиотеку 'net' для Node.js.
server.js- серверная часть, слушает TCP порт 2000 (ждет подключений);client.js- клиентская часть, подключается к127.0.0.1на порт2000.
Запускать нужно из двух консолей, сначала из первой консоли node server, потом из второй node client. После запуска client.js подключается к серверу и отправляет ему привет. При подключении клиента, сервер отправляет ему при помощи метода socket.write(data) объект user, сериализованный (преобразованный в строку) через JSON.stringify(object). При подключении сервер еще выводит в консоль IP адрес клиента из socket.localAddress. Дальше сервер вешает событие на получение данных из клиентского сокета через socket.on('data', function). Клиент, точно так же вешает на свой сокет событие получения данных, и когда они приходят, то передает их для парсинга (синтаксического разбора) в метод JSON.parse(string), результатом выполнения которого, есть обычный объект JavaScript, с которым можно работать, как с объявленным в нашем процессе, например, читать и писать его свойства и обращаться к методам (функциям). Например: console.log(user.age) или console.log(user['age']) или user.doSometging(argument).
- Сделать ту же распределенную задачу с умножением массива, пример которой приведен в
/workers, только на TCP сокетах. - Усовершенствовать задачу так, чтоб массив разбивался на части, которые отправляются в разные процессы и разные части массива должны обрабатываться в разных процессах, а результаты сливаться в родительский процесс в любом порядке.
- Сделать так, чтобы результаты склеивались в родительском процессе в том же порядке, в котором задача была разделена на части.
- Реализовать работу системы с произвольным кол-вом вычислительных клиентов и отслеживать их занятость, т.е. мы имеем массив клиентов, отмечаем в нем, что некоторые получили задачу и еще не вернули ответ, и можем разделять новые задачи в любой момент на свободных клиентов.
- Реализовать два типа клиентов, первый уже есть, он выполняет вычисления, а второй - дает задачу серверу. Таким образом, один тип клиента это customer (заказчик услуги), а второй это worker (исполнитель услуги). Сервер теперь выполняет функцию brocker (брокера услуги).
- Применить для обмена между процессами протокол JSTP: HowProgrammingWorks/JSTP
- Реализовать любую задачу при помощи этого примера распределенных вычислений из курса "Численные методы" или других разделов вычислительной математики. Например, решение СЛАУ.
