質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1048閲覧

node.jsのclusterモジュールで配列と組み合わせたい

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/05/22 04:02

編集2018/05/22 04:33

node v9.11.1

プロセスを分けたいのですが、配列の値ごとに分けたいのです。

javascript

1'use strict'; 2 3const cluster = require('cluster'); 4const numCPUs = require('os').cpus().length; 5 6const arr = [1, 2, 3, 4, 5]; 7 8const main = () => { 9 for (const n of arr) { 10 if (cluster.isMaster) { 11 for (let i = 0; i < numCPUs; i++) { 12 console.log('parent:', n, process.pid); 13 cluster.fork(); 14 } 15 } else { 16 console.log('child:', n, process.pid); 17 process.exit(); 18 } 19 } 20} 21 22main();

配列arrがありまして、その値を子プロセスで使いたいのです。
上のコードを実行すると、

bash

1parent: 1 3735 2parent: 1 3735 3parent: 1 3735 4parent: 1 3735 5parent: 1 3735 6parent: 1 3735 7parent: 1 3735 8parent: 1 3735 9parent: 2 3735 10parent: 2 3735 11parent: 2 3735 12parent: 2 3735 13parent: 2 3735 14child: 1 3738 15parent: 2 3735 16child: 1 3736 17parent: 2 3735 18parent: 2 3735 19parent: 3 3735 20parent: 3 3735 21parent: 3 3735 22parent: 3 3735 23parent: 3 3735 24parent: 3 3735 25parent: 3 3735 26parent: 3 3735 27parent: 4 3735 28parent: 4 3735 29parent: 4 3735 30parent: 4 3735 31parent: 4 3735 32parent: 4 3735 33parent: 4 3735 34parent: 4 3735 35parent: 5 3735 36child: 1 3739 37parent: 5 3735 38parent: 5 3735 39parent: 5 3735 40parent: 5 3735 41parent: 5 3735 42parent: 5 3735 43parent: 5 3735 44child: 1 3737 45child: 1 3743 46child: 1 3742 47child: 1 3741 48child: 1 3740 49child: 1 3744 50child: 1 3745 51child: 1 3747 52child: 1 3746 53child: 1 3750 54child: 1 3757 55child: 1 3755 56child: 1 3751 57child: 1 3749 58child: 1 3760 59child: 1 3774 60child: 1 3767 61child: 1 3768 62child: 1 3754 63child: 1 3775 64child: 1 3756 65child: 1 3770 66child: 1 3759 67child: 1 3771 68child: 1 3748 69child: 1 3769 70child: 1 3773 71child: 1 3752 72child: 1 3753 73child: 1 3766 74child: 1 3762 75child: 1 3764 76child: 1 3772 77child: 1 3765 78child: 1 3758 79child: 1 3761 80child: 1 3763

上記のようになるのですが、childのプロセスが1だけになってしまいます。
子プロセスも配列arrの1〜5に分けたいのですが、どのようにすればいいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みですがこんな風にかくのかなーと思いました。

test.js

js

1'use strict'; 2 3const cluster = require('cluster'); 4const numCPUs = require('os').cpus().length; 5 6const arr = [1, 2, 3, 4, 5]; 7 8const master = () => { 9 const workers = new Array(numCPUs); 10 console.log(`numCPUs = ${numCPUs}`) 11 for (let i = 0; i < numCPUs; i++) { 12 workers[i] = cluster.fork(); 13 console.log(`fork #${workers[i].id} pid ${workers[i].process.pid}`) 14 } 15 arr.map((n, i) => { 16 const wid = i % workers.length; 17 console.log(`dispatch ${n} to #${workers[wid].id}`) 18 workers[wid].send(n) 19 }) 20 workers.forEach(w => { 21 w.disconnect(); 22 }) 23} 24 25const child = () => { 26 process.on('message', msg => { 27 console.log(`child(${process.pid}): ${msg}`) 28 }) 29 process.on('disconnect', () => { 30 console.log(`child(${process.pid}): disconnected`) 31 process.exit(); 32 }) 33} 34 35if (cluster.isMaster) { 36 master(); 37} else { 38 child(); 39}

bash

1$ node test 2numCPUs = 4 3fork #1 pid 27036 4fork #2 pid 8068 5fork #3 pid 30524 6fork #4 pid 39476 7dispatch 1 to #1 8dispatch 2 to #2 9dispatch 3 to #3 10dispatch 4 to #4 11dispatch 5 to #1 12child(27036): 1 13child(27036): 5 14child(27036): disconnected 15child(30524): 3 16child(30524): disconnected 17child(39476): 4 18child(39476): disconnected 19child(8068): 2 20child(8068): disconnected 21$

子供が適切なタイミングでexitしないと親プロセスが終わってくれない気がします。

投稿2018/05/22 05:15

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/22 06:08

ありがとうございます。完璧です。
KSwordOfHaste

2018/05/22 06:10

気づくとセミコロンが一貫してないです。汚くてスミマセン
guest

0

ベストアンサー

すみません、自己解決しました。
コードが間違ってました。
process.exit();を消したら解決しました、すみません。。。

javascript

1'use strict'; 2 3const cluster = require('cluster'); 4const numCPUs = require('os').cpus().length; 5 6const arr = [1, 2, 3, 4, 5]; 7 8const main = () => { 9 for (let n of arr) { 10 if (cluster.isMaster) { 11 for (let i = 0; i < numCPUs; i++) { 12 console.log('parent:', n, process.pid); 13 cluster.fork(); 14 } 15 } else { 16 console.log('child:', n, process.pid); 17 // process.exit(); 18 } 19 } 20} 21 22main();

投稿2018/05/22 04:36

編集2018/05/22 04:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問