【问题标题】:Send http response object to the newly forked process / webworker将 http 响应对象发送到新分叉的进程 / webworker
【发布时间】:2015-12-29 11:25:44
【问题描述】:

我有一个节点 http 服务器。它有一个主进程,我在其中分叉了子进程/webworker。

我希望主节点进程处理 http 请求并将此请求传递给分叉的进程或 web worker,以便他们可以独立处理请求并向其发送响应。

问题:- 我无法将响应对象发送给子进程/网络工作者。

节点也不允许共享变量。所以我不能将它存储在父进程中并与子进程共享它的引用。

有什么方法可以实现吗?

【问题讨论】:

    标签: node.js http web-worker child-process shared-data


    【解决方案1】:

    正如你所说,你不能传递响应对象。但是,您可以传递某种标识符,让主线程在工作人员完成工作时检索正确的响应对象。

    例如你可以

    • 在主线程中,通过唯一的整数 ID 存储每个响应对象
    • 将此 ID 传递给工作人员
    • worker 完成后,将此 ID 连同其工作结果一起传回主线程
    • 主线程检索正确的响应对象,并将结果传递回客户端(即网络浏览器)

    下面是一个基本的实现

    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);
    

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 2021-07-14
      • 2020-08-08
      • 2016-01-12
      • 2012-09-18
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多