【问题标题】: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);