2012-11-14 35 views
45

Đây là vấn đề của tôi. Tôi đã triển khai một kịch bản nhỏ thực hiện một số phép tính nặng, như là một mô-đun node.js. Vì vậy, nếu tôi nhập "nút myModule.js", nó tính toán trong một giây, sau đó trả về một giá trị. Bây giờ, tôi muốn sử dụng mô đun đó từ chương trình Node.JS chính của mình. Tôi chỉ có thể đặt tất cả các tính toán trong một hàm "doSomeCalculation" sau đó làm:Làm cách nào để thực thi mô-đun node.js như một tiến trình con của một chương trình node.js?

var myModule = require("./myModule"); 
myModule.doSomeCalculation(); 

Nhưng điều đó sẽ bị chặn, do đó nó sẽ là xấu. Tôi muốn sử dụng nó theo cách không chặn, ví dụ như các cuộc gọi DB chẳng hạn. Vì vậy, tôi đã cố gắng sử dụng child_process.spawn và exec, như sau:

var spawn = require("child_process").spawn; 
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ }); 
ext.on("exit", function() { console.log("calculation over!"); }); 

Nhưng, tất nhiên, nó không hoạt động. Tôi đã cố gắng sử dụng một EventEmitter trong myModule, phát ra các sự kiện "calculateDone" và cố gắng thêm trình nghe có liên quan vào biến "ext" trong ví dụ trên. Vẫn không hoạt động.

Đối với dĩa, chúng không thực sự là những gì tôi đang cố gắng làm. Forks sẽ yêu cầu đặt mã liên quan đến tính toán trong chương trình chính, forking, tính toán trong các con trong khi cha mẹ làm bất cứ điều gì nó, và sau đó làm thế nào tôi sẽ trả lại kết quả?

Vì vậy, đây là câu hỏi của tôi: tôi có thể sử dụng quy trình con để thực hiện một số tính toán không chặn, khi tính toán được đặt trong tệp Node hay không? Tôi có nên tính toán nặng trong một tập lệnh Python thay thế không? Trong cả hai trường hợp, làm thế nào tôi có thể vượt qua các đối số cho quá trình con - ví dụ, một hình ảnh?

+7

"Xin chào"? Nó có thể là buổi sáng (hoặc thậm chí tệ hơn!) Ở một nơi khác :) – elmigranto

Trả lời

105

Tôi nghĩ rằng những gì bạn đang theo dõi là API child_process.fork().

Ví dụ, nếu bạn có hai tập tin sau đây:

Trong main.js:

var cp = require('child_process'); 
var child = cp.fork('./worker'); 

child.on('message', function(m) { 
    // Receive results from child process 
    console.log('received: ' + m); 
}); 

// Send child process some work 
child.send('Please up-case this string'); 

Trong worker.js:

process.on('message', function(m) { 
    // Do work (in this case just up-case the string 
    m = m.toUpperCase(); 

    // Pass results back to parent process 
    process.send(m.toUpperCase(m)); 
}); 

Sau đó, để chạy chính (và spawn quy trình công nhân trẻ em cho mã worker.js ...)

$ node --version 
v0.8.3 

$ node main.js 
received: PLEASE UP-CASE THIS STRING 
+0

Cảm ơn rất nhiều câu trả lời của bạn! Nó hoạt động hoàn hảo ngay bây giờ. – user1822364

+11

Cuộc gọi tốt hơn nên là 'cp.fork (__ dirname + '/ worker');' để làm cho nó hoạt động nếu bạn chạy 'main.js' từ một vị trí khác. – CoDEmanX

2

Nó không quan trọng những gì bạn sẽ sử dụng như một đứa trẻ (Node, Python, bất cứ điều gì), Node không quan tâm. Chỉ cần đảm bảo rằng tập lệnh tính toán của bạn thoát sau mọi thứ được thực hiện và kết quả được ghi thành stdout.

Lý do tại sao nó không hoạt động là bạn đang sử dụng spawn thay vì exec.

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