{"id":25732261,"url":"https://github.com/howprogrammingworks/interprocesscommunication","last_synced_at":"2026-04-09T10:03:36.706Z","repository":{"id":147758375,"uuid":"52200441","full_name":"HowProgrammingWorks/InterProcessCommunication","owner":"HowProgrammingWorks","description":"Inter-process Communication","archived":false,"fork":false,"pushed_at":"2023-04-28T20:28:36.000Z","size":29,"stargazers_count":17,"open_issues_count":3,"forks_count":52,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-08-31T20:46:20.326Z","etag":null,"topics":["inter-process-communication","ipc","jstp","rpc","tcp"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/TimurShemsedinov","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HowProgrammingWorks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-02-21T10:01:00.000Z","updated_at":"2024-09-03T07:32:49.000Z","dependencies_parsed_at":"2023-03-30T22:03:52.294Z","dependency_job_id":null,"html_url":"https://github.com/HowProgrammingWorks/InterProcessCommunication","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HowProgrammingWorks/InterProcessCommunication","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FInterProcessCommunication","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FInterProcessCommunication/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FInterProcessCommunication/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FInterProcessCommunication/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HowProgrammingWorks","download_url":"https://codeload.github.com/HowProgrammingWorks/InterProcessCommunication/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FInterProcessCommunication/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278245021,"owners_count":25955007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["inter-process-communication","ipc","jstp","rpc","tcp"],"created_at":"2025-02-26T03:40:10.961Z","updated_at":"2025-10-03T23:35:38.372Z","avatar_url":"https://github.com/HowProgrammingWorks.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Межпроцессовое взаимодействие\n\n[Задать вопрос](https://github.com/HowProgrammingWorks/LiveQA/discussions/categories/q-a)\n\n[![Межпроцессовое взаимодействие в Node.js](https://img.youtube.com/vi/2OXWZFMvfbc/0.jpg)](https://www.youtube.com/watch?v=2OXWZFMvfbc)\n\n### Через IPC в node.js\n\nЗаходим в каталог `/workers`, проект разделен на 3 файла (хотя, все можно было\nбы написать и в одном, но мы делаем так для нашего удобства):\n\n* `multicore.js` - это запускаемый модуль, запускаем так `node multicore`\n* `master.js` - модуль, который запускается в родительском процессе\n* `worker.js` - модуль, который запускается в дочернем процессе\n\nЗапускаем 'node multicore', который подгружает сначала `master.js` и происходит\nпорождение дочерних процессов по количеству ядер процессора\n`os.cpus().length` при помощи `cluster.fork()`, ссылки на воркеры\nскладываются в массив `workers`. Родительский процесс рассылает дочерним через\n`worker.send()` задачу на исполнение. Дочерний процесс ловит задачу (это\nмассив) и перемножает все его элементы на 2, после чего отправляет результат\nобратно в родительский процесс. Когда родительский процесс получает ответы от\nвсех дочерних, то он выходит, завершая и дочерние.\n\n### Через TCP сокеты\n\nЗаходим в каталог `/tcpServer`. Тут лежит пример передачи объекта из адресного\nпространства одного процесса, в адресное пространство другого при помощи\nпротокола TCP/IP и сокетов операционной системы, API которых обернуто в\nбиблиотеку 'net' для Node.js.\n\n* `server.js` - серверная часть, слушает TCP порт 2000 (ждет подключений);\n* `client.js` - клиентская часть, подключается к `127.0.0.1` на порт `2000`.\n\nЗапускать нужно из двух консолей, сначала из первой консоли `node server`, потом\nиз второй `node client`. После запуска `client.js` подключается к серверу и\nотправляет ему привет. При подключении клиента, сервер отправляет ему при помощи\nметода `socket.write(data)` объект `user`, сериализованный (преобразованный в\nстроку) через `JSON.stringify(object)`. При подключении сервер еще выводит в\nконсоль IP адрес клиента из `socket.localAddress`. Дальше сервер вешает событие\nна получение данных из клиентского сокета через `socket.on('data', function)`.\nКлиент, точно так же вешает на свой сокет событие получения данных, и когда они\nприходят, то передает их для парсинга (синтаксического разбора) в метод\n`JSON.parse(string)`, результатом выполнения которого, есть обычный объект\nJavaScript, с которым можно работать, как с объявленным в нашем процессе,\nнапример, читать и писать его свойства и обращаться к методам (функциям).\nНапример: `console.log(user.age)` или `console.log(user['age'])` или\n`user.doSometging(argument)`.\n\n## Задания\n\n1. Сделать ту же распределенную задачу с умножением массива, пример которой\nприведен в `/workers`, только на TCP сокетах.\n2. Усовершенствовать задачу так, чтоб массив разбивался на части, которые\nотправляются в разные процессы и разные части массива должны обрабатываться в\nразных процессах, а результаты сливаться в родительский процесс в любом порядке.\n3. Сделать так, чтобы результаты склеивались в родительском процессе в том же\nпорядке, в котором задача была разделена на части.\n\n## Дополнительные задания\n\n1. Реализовать работу системы с произвольным кол-вом вычислительных клиентов\nи отслеживать их занятость, т.е. мы имеем массив клиентов, отмечаем в нем, что\nнекоторые получили задачу и еще не вернули ответ, и можем разделять новые задачи\nв любой момент на свободных клиентов.\n2. Реализовать два типа клиентов, первый уже есть, он выполняет вычисления, а\nвторой - дает задачу серверу. Таким образом, один тип клиента это customer\n(заказчик услуги), а второй это worker (исполнитель услуги). Сервер теперь\nвыполняет функцию brocker (брокера услуги).\n3. Применить для обмена между процессами протокол JSTP:\n[HowProgrammingWorks/JSTP](https://github.com/HowProgrammingWorks/JSTP)\n4. Реализовать любую задачу при помощи этого примера распределенных вычислений\nиз курса \"Численные методы\" или других разделов вычислительной математики.\nНапример, решение СЛАУ.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowprogrammingworks%2Finterprocesscommunication","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhowprogrammingworks%2Finterprocesscommunication","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowprogrammingworks%2Finterprocesscommunication/lists"}