0

ノードhttpサーバーがあります。メインプロセスがあり、子プロセス/ webworkerをフォークしました。

メイン ノード プロセスが http 要求を処理し、この要求をフォークされたプロセスまたは Web ワーカーに渡して、要求を個別に処理し、応答を送信できるようにします。

問題:- ここで、応答オブジェクトを子プロセス/Web ワーカーに送信できません。

Node では、変数の共有も許可されていません。そのため、親プロセスに保存して、その参照を子プロセスと共有することはできません。

それが可能な方法はありますか?

4

1 に答える 1

0

あなたが言うように、応答オブジェクトを渡すことはできません。ただし、ワーカーが作業を完了したときにメイン スレッドが正しい応答オブジェクトを取得できるようにする、ある種の識別子を渡すことができます。

たとえば、次のことができます

  • メインスレッドでは、各応答オブジェクトを一意の整数 ID で保存します
  • この ID をワーカーに渡します
  • ワーカーが完了したら、この ID をその作業の結果とともにメイン スレッドに戻します。
  • メイン スレッドは正しい応答オブジェクトを取得し、結果をクライアント (つまり、Web ブラウザー) に返します。

以下は基本的な実装です

var http = require('http');
var Worker = require('webworker-threads').Worker;

// Store in-progress responses by unique(-enough) ID
// that is passed to the worker that then passes it back
var responses = {
  _nextResponseId: 0,
  _responses: {},
  store: function store(response) {
    var id = this._nextResponseId;
    this._nextResponseId = this._nextResponseId === Number.MAX_SAFE_INTEGER ? 0 : (this._nextResponseId + 1);
    this._responses[id] = response;
    return id;
  },
  remove: function remove(id) {
    var response = this._responses[id];
    delete this._responses[id];
    return response;
  }
};

// Worker,simulating something long and synchronous
var worker = new Worker(function() {
  onmessage = function(event) {
    var id = event.data.id;
    for (var i = 0; i < 1000000000; ++i) {}
    self.postMessage({
      id: id,
      message: 'From worker, request ' + id
    });
  };
});

// A worker message ends the original http response
worker.onmessage = function(event) {
  var response = responses.remove(event.data.id);
  response.end(event.data.message);
};

// Simple server that calls the worker with the id of the response
var server = http.createServer(function handleRequest(request, response) {
  var id = responses.store(response);
  worker.postMessage({
    id: id
  });
});
server.listen(8083);
于 2015-12-31T17:50:48.343 に答える