2014-07-05 16 views
8

Tôi có một loạt các quy trình (con) trong node.js cần chuyển một lượng lớn dữ liệu.Làm thế nào để chuyển/truyền dữ liệu lớn từ/đến các tiến trình con trong node.js mà không sử dụng chặn stdio?

Khi tôi đọc hướng dẫn sử dụng, thông báo nói rằng phần giới thiệu stdio và ipc giữa chúng đang chặn, vì vậy sẽ không thực hiện được.

Tôi đang tìm vào sử dụng file descriptor nhưng tôi không thể tìm thấy một cách để dòng từ họ (xem tôi khác câu hỏi cụ thể hơn How to stream to/from a file descriptor in node?)

Tôi nghĩ rằng tôi có thể sử dụng một ổ cắm net, nhưng tôi sợ rằng có không mong muốn trên không.

Tôi cũng thấy điều này nhưng nó không giống nhau (và không có câu trả lời: How to send huge amounts of data from child process to parent process in a non-blocking way in Node.js?)

Trả lời

9

Tôi tìm thấy một giải pháp mà dường như làm việc: khi đẻ trứng quá trình con bạn có thể vượt qua các tùy chọn cho stdio và thiết lập một đường ống để dữ liệu luồng.

Bí quyết là thêm phần tử bổ sung và đặt thành 'đường ống'.

Trong luồng quy trình mẹ quy trình child.stdio[3].

var opts = { 
    stdio: [process.stdin, process.stdout, process.stderr, 'pipe'] 
}; 
var child = child_process.spawn('node', ['./child.js'], opts); 

// send data 
mySource.pipe(child.stdio[3]); 

//read data 
child.stdio[3].pipe(myHandler); 

Trong de con dòng mở cho mô tả tập tin 3.

// read from it 
var readable = fs.createReadStream(null, {fd: 3}); 

// write to it 
var writable = fs.createWriteStream(null, {fd: 3}); 

Lưu ý rằng không phải mọi dòng bạn nhận được từ NPM hoạt động chính xác, tôi đã cố gắng JSONStream.stringify() nhưng nó tạo ra lỗi, nhưng nó làm việc sau Tôi đã chuyển nó qua through2. (không có ý tưởng tại sao đó là).

Chỉnh sửa: một số quan sát: có vẻ như đường ống không phải lúc nào cũng là luồng song công, vì vậy bạn có thể cần hai đường ống. Và có một cái gì đó kỳ lạ xảy ra ở đâu trong một trường hợp nó chỉ hoạt động nếu tôi cũng có một kênh ipc, vì vậy 6 tổng: [stdin, stdout, stderr, pipe, pipe, ipc].

+0

Đối với chỉnh sửa của bạn: Tôi có thể sai (không quen thuộc với cơ sở mã Node), nhưng [có vẻ như] (https://github.com/nodejs/node/blob/v4.x/lib/internal /child_process.js#L313) 'stdin' là đường ống duy nhất được đảm bảo có thể ghi được từ tiến trình cha. –

Các vấn đề liên quan