node.jsの長期的な計算
-
25-09-2019 - |
質問
Node.jsでゲームサーバーを書いています。一部の操作には、サーバーの一部での重い計算が含まれます。それらの計算を実行している間、接続を受け入れるのを止めたくありません。Node.jsがスレッドをサポートしていないときにバックグラウンドでそれらを実行するにはどうすればよいですか?
解決
これらのどちらも個人的には保証することはできませんが、作業を処理することに地獄に携わっている場合、ノードモジュールページにリストされているように、ノード用のWebworkers APIの独立した実装がいくつかありました。 :
- http://github.com/cramforce/node-worker
- http://github.com/pgriess/node-webworker
一見すると、2番目はより成熟しているように見え、これらはどちらも基本的にスレッドプログラミングを行うことができますが、基本的に俳優モデルであるため、すべてメッセージの渡しで行われ、データ構造などを共有することはできません。
また、Node.jsチームは、その価値があるため、このAPIをネイティブに正確に実装する予定であるため、これらのツールは完璧でなくても、まともな停止かもしれません。
他のヒント
var spawn = require('child_process').spawn;
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need
//then you can attach events to that list like this
listorwhatev.on('exit', function(code){});
///or in this ls example as it streams info
listorwhatev.stdout.on('data', function(info){sys.puts(info);});
アプリケーションごとに一度スポーンプロセスが発生してから、それに詰め込み、接続ごとのイベントを監視してください。また、ListorWhateVが処理する前にまだ実行されていることを確認する必要があります。私たちは皆、ノードがアプリをクラッシュさせるこれらの猛攻撃エラーを愛しているので、私たちはそうしないでください;)スポーン(PID)があなたのマシンでキルや悪いことが起こり、あなたはあなたのコードのスポーンを優雅に終わらなかったとき、あなたのストリームイベントハンドラーはアプリをクラッシュさせます。
また、一部の操作には、サーバーの一部での重い計算が含まれます
そもそも計算重いコードをどのように書きましたか。 node.jsで行うのは非常に難しいです
node.jsがスレッドをサポートしていない場合、どのようにバックグラウンドでそれらを実行できますか
いくつかのワーカー(ノード)インスタンスを生成し、RedisブロッキングPOPを使用して接続の受け入れ(ノードインスタンス)と通信することができます。 node.js redisライブラリはブロックしていません。