2017-01-25 18 views
6

Tôi đang cố gắng sử dụng node-unfluff, trích xuất nội dung từ chuỗi HTML. Tuy nhiên, nó thường mất ~ 200ms để chạy. Kể từ khi nó chạy đồng bộ, đây là cách quá chậm. Tôi muốn làm cho nó chạy không đồng bộ.Công nhân Web và child_process cho các chức năng chuyên sâu của CPU trong Node.js

Theo như tôi biết, các tùy chọn của tôi là Công nhân Web (https://github.com/audreyt/node-webworker-threads) hoặc child_process (https://nodejs.org/api/child_process.html). Có lựa chọn nào khác tốt hơn không?

Nếu không, điều nào trong số này tốt hơn về mặt tốc độ hoặc các yếu tố khác?

Edit:

Ngoài ra còn có Chủ đề à gogo (https://github.com/xk/node-threads-a-gogo) và nhỏ xíu nghiệp (https://github.com/avoidwork/tiny-worker).

Chủ đề WebWorker không hỗ trợ require, do đó, đó không còn là tùy chọn.

Có thể gửi require tệp bằng cách sử dụng Threads à gogo bằng cách sử dụng chức năng load, nhưng có vẻ như cách giải quyết khác.

công nhân nhỏ chỉ có 26 sao trên Github vào lúc này, vì vậy tôi do dự khi sử dụng nó trong mã sản xuất. Nó hỗ trợ require.

Tôi đang cân nhắc việc viết triển khai WebWorker của riêng mình bằng cách sử dụng child_process nếu không có tùy chọn nào tốt hơn.

+0

Bạn có thể giải thích trường hợp sử dụng của mình thêm một chút không? Bạn đang cố gắng để có được song song trong việc xử lý nhiều URL hoặc bạn đang cố gắng bằng cách nào đó tăng hiệu suất trong nút-unfluff? Bạn đã hình dung ra thế nào khi sử dụng các tiến trình con khi bạn đang phụ thuộc vào một thư viện trong Node? Tại sao cụm nút tiêu chuẩn không phải là một tùy chọn trong danh sách của bạn (lưu ý rằng nó thực sự dựa vào các tiến trình con)? – SylonZero

+0

Tôi đang sử dụng Node làm máy chủ. Nếu một hàm chạy 200ms thì không người dùng nào có thể nhận được phản hồi của máy chủ trong 200ms. Tôi muốn làm cho nó không đồng bộ nên máy chủ không bị chặn. Tôi có thể sử dụng 'child_process' để bắt đầu một quá trình Node khác. Tôi chưa bao giờ sử dụng Node clustering trước đây, nhưng sự hiểu biết của tôi là nó tạo ra một máy chủ cho mỗi lõi. Nếu 'node-unfluff' đang chạy trên mỗi lõi, thì mọi máy chủ bị chặn. –

+0

Ok, câu hỏi của bạn đang bắt đầu trở nên rõ ràng hơn. Tuy nhiên, ngay cả khi một thể hiện của một hàm (sử dụng nút-unfluff) là đồng bộ, điều đó không ngăn các trường hợp khác cho các yêu cầu khác tới Node khỏi bị sa thải. Vì vậy, một người dùng có thể phải chờ 200ms nhưng điều đó thường không có nghĩa là các yêu cầu cho * người dùng * khác không thể khởi động được.Bạn đã thử nghiệm và thấy rằng sử dụng mô-đun này không thực sự chặn các yêu cầu đồng thời không? – SylonZero

Trả lời

1

Bạn có thể sử dụng yêu cầu với Người lao động. Trong kịch bản Worker của bạn, bạn sẽ cần phải gọi

self.importScripts('../path/require.js'); 

Theo yêu cầu tài liệu bạn có thể vượt qua một đối tượng cấu hình cho một mô-đun:

requirejs.config({ 
    //By default load any module IDs from js/lib 
    baseUrl: 'js/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
}); 

Đưa nó cùng

Worker. js

self.importScripts('../path/require.js'); 
requirejs.config({ 
    //By default load any module IDs from path/lib 
    baseUrl: 'path/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
    // now you can post a message back to your callee script to let it know require has loaded 
    self.postMessage("initialized"); 
}); 

self.onmessage = function(message) { 
    // do cpu intensive work here, this example is not cpu intensive... 
    if(message.data === 'to process') { 
     self.postMessage("completed!"); 
    } 
} 

Node Worker Call

var worker = new Worker('Worker.js'); 
worker.onmessage = function(event) { 
    var msg = event.data; 
    if(msg === 'initialized') { 
     worker.postMessage({data: 'to process'}); 
    } 
} 
Các vấn đề liên quan