2012-11-28 35 views
5

xem xét:Làm thế nào để một tiến trình cha mẹ gửi đối tượng socket/server tới tiến trình con trong Node.js?

// Parent 

var child = require('child_process').fork('child.js'); 

// Open up the server object and send the handle. 
var server = require('net').createServer(); 
server.on('connection', function (socket) { 
    socket.end('handled by parent'); 
}); 
server.listen(1337, function() { 
    child.send('server', server); 
}); 

//Child 
process.on('message', function(m, server) { 
    if (m === 'server') { 
    server.on('connection', function (socket) { 
     socket.end('handled by child'); 
    }); 
    } 
}); 

Như trong ví dụ trên, các bậc cha mẹ gửi đối tượng máy chủ để tiến trình con để mà ngay cả một đứa trẻ đã xử lý một số yêu cầu kết nối khách hàng.

Làm thế nào để đạt được trong Node.js?

Trả lời

2

tôi đề nghị bạn hãy xem các Node.js cluster module:

Khi bạn gọi server.listen(...) trong một công nhân, nó serializes các đối số và chuyển yêu cầu đến quá trình tổng thể. Nếu quá trình tổng thể đã có một máy chủ nghe phù hợp với yêu cầu của nhân viên, thì nó sẽ truyền tay cầm cho người lao động. Nếu nó không có một máy chủ nghe phù hợp với yêu cầu đó, thì nó sẽ tạo một máy chủ và truyền tay cầm cho đứa trẻ.

Toàn bộ ví dụ từ the documentation:

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    }); 
} else { 
    // Workers can share any TCP connection 
    // In this case it's an HTTP server 
    http.createServer(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    }).listen(8000); 
} 
+0

Hi Linus, u có thể ném một số ánh sáng về cách đối tượng máy chủ đang được truyền cho quá trình con trong ví dụ được đưa ra bởi tôi? – Ashish

+0

Điều này dường như là [các phần của nguồn] có liên quan (https://github.com/joyent/node/blob/c668185adde3a474585a11f172b8387e270ec23b/lib/cluster.js#L523-558). –

+0

Yêu cầu tò mò; điều này sẽ làm việc với 'child_process.fork'? –

3

Đây là what node does when process.send is called with a handle argument.

Và sau khi đọc điều đó, the handleConversion function cũng rất thú vị để đọc.

Tôi chưa hiểu đầy đủ, nhưng tôi nghĩ về cơ bản trạng thái của socket/máy chủ được tuần tự hóa và chuyển giữa master/worker bằng IPC. Có lẽ nhà nước đang được thông qua xung quanh là đủ cho mỗi quá trình để ràng buộc chính nó vào ổ cắm? Hoặc có thể cha mẹ đang giữ sổ đăng ký của những đứa trẻ có thể xử lý bất kỳ ổ cắm cụ thể nào, vì vậy khi một kết nối mới có trong một số ổ cắm, nó sẽ được gửi đến một đứa trẻ đã đăng ký nó. Phần đó tôi ít chắc chắn hơn.

3

Hiện tại là possible, nhưng chỉ khi bạn đang sử dụng mô-đun net, bạn là ai.

child.send('socket', socket); Sử dụng tham số thứ hai để gửi:

Và để nhận được từ tiến trình con:

process.on('message', function(m, socket) { 
    if (m === 'socket') { 
     console.log(socket); // Net socket object here 
    } 
}); 
Các vấn đề liên quan