Có cách nào để tạo luồng để chạy nhiều phương thức cùng một lúc không?
Bằng cách đó, nếu bất kỳ phương thức nào bị lỗi giữa tất cả các luồng khác sẽ bị giết.
Có cách nào để tạo luồng để chạy nhiều phương thức cùng một lúc không?
Bằng cách đó, nếu bất kỳ phương thức nào bị lỗi giữa tất cả các luồng khác sẽ bị giết.
Câu trả lời:
Mọi quy trình node.js là một luồng đơn theo thiết kế. Do đó, để có được nhiều luồng, bạn phải có nhiều quy trình (Như một số áp phích khác đã chỉ ra, cũng có những thư viện bạn có thể liên kết đến sẽ cung cấp cho bạn khả năng làm việc với các luồng trong Node, nhưng không có khả năng như vậy nếu không có các thư viện đó . Xem câu trả lời của Shawn Vincent tham khảo https://github.com/audreyt/node-webworker-threads )
Bạn có thể bắt đầu các quy trình con từ quy trình chính của mình như được hiển thị ở đây trong tài liệu node.js: http://nodejs.org/api/child_process.html . Các ví dụ khá tốt trên trang này và khá dễ hiểu.
Sau đó, quy trình mẹ của bạn có thể theo dõi sự kiện đóng trên bất kỳ quy trình nào mà nó bắt đầu và sau đó có thể buộc đóng các quy trình khác mà bạn đã bắt đầu để đạt được loại chiến lược dừng tất cả thất bại mà bạn đang nói đến.
Xem thêm: Node.js trên máy đa lõi
Cũng có ít nhất một thư viện để thực hiện phân luồng gốc từ bên trong Node.js: node-webworker-thread
https://github.com/audreyt/node-webworker-threads
Điều này về cơ bản triển khai API trình duyệt Web Worker cho node.js.
Từ Node 10.5 hiện đã có hỗ trợ đa luồng , nhưng nó là thử nghiệm . Hy vọng điều này sẽ sớm trở nên ổn định.
Kiểm tra các tài nguyên sau:
Cập nhật :
Từ Node v11.7.0 trở đi, bạn không cần phải sử dụng --experimental-worker
cờ.
Ghi chú phát hành: https://nodejs.org/en/blog/release/v11.7.0/
Bạn có thể nhận đa luồng bằng Napa.js.
https://github.com/Microsoft/napajs
"Napa.js là thời gian chạy JavaScript đa luồng được xây dựng trên V8, ban đầu được thiết kế để phát triển các dịch vụ lặp đi lặp lại cao với hiệu suất không bị tổn hại trong Bing. Khi nó phát triển, chúng tôi thấy hữu ích khi bổ sung Node.js trong các tác vụ ràng buộc CPU , với khả năng thực thi JavaScript trong nhiều phân lập V8 và giao tiếp giữa chúng. Napa.js được hiển thị như một mô-đun Node.js, trong khi nó cũng có thể được nhúng vào một quy trình máy chủ mà không phụ thuộc Node.js. "
Nếu bạn đang sử dụng Rx, việc plugin trong rxjs-cluster khá đơn giản để chia công việc thành thực thi song song. (tuyên bố từ chối trách nhiệm: Tôi là tác giả)
Tôi cần đa luồng thực sự trong Node.js và thứ phù hợp với tôi là gói luồng . Nó tạo ra một quá trình khác có vòng lặp thông báo Node.js của riêng nó, vì vậy chúng không chặn lẫn nhau. Việc thiết lập dễ dàng và tài liệu giúp bạn thiết lập và chạy nhanh chóng. Chương trình chính của bạn và các worker có thể giao tiếp theo cả hai cách và các "thread" của worker có thể bị ngắt nếu cần.
Vì đa luồng và Node.js là một chủ đề phức tạp và được thảo luận rộng rãi nên khá khó khăn để tìm một gói phù hợp với yêu cầu cụ thể của tôi . Đối với hồ sơ, những điều này không hoạt động đối với tôi :
require
các mô-đun -ing trong worker mà tôi cầnVà đối với những người hỏi tại sao tôi cần đa luồng thực sự : Đối với một ứng dụng liên quan đến Raspberry Pi và bị gián đoạn. Một luồng xử lý các ngắt đó và một luồng khác xử lý việc lưu trữ dữ liệu (và hơn thế nữa).
Các nodejs 10.5.0 phát hành đã công bố đa luồng trong Node.js . Tính năng vẫn đang thử nghiệm. Hiện có một mô-đun worker_threads mới .
Bạn có thể bắt đầu sử dụng các luồng công nhân nếu bạn chạy Node.js v10.5.0 trở lên , nhưng đây là một API thử nghiệm . Nó không khả dụng theo mặc định: bạn cần kích hoạt nó bằng cách sử dụng --experimental-worker khi gọi Node.js.
Đây là một ví dụ với ES6 và worker_threads được bật, được thử nghiệm trên phiên bản 12.3.1
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
Bây giờ, bạn cần nhập Worker từ worker_threads . Lưu ý: Bạn cần khai báo tệp js với phần mở rộng '.mjs' để được hỗ trợ ES6.
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
Cuối cùng, chúng tôi tạo một workerService.mjs
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
Đầu ra:
npm chạy bắt đầu
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
Hiện tại cũng có https://github.com/xk/node-threads-a-gogo , mặc dù tôi không chắc về trạng thái dự án.
NodeJS hiện bao gồm các chủ đề (như một tính năng thử nghiệm tại thời điểm trả lời).
Bạn có thể đang tìm kiếm Promise.race
(giải pháp đua I / O gốc, không phải chuỗi)
Giả sử bạn (hoặc những người khác đang tìm kiếm câu hỏi này) muốn chạy các luồng để tránh thất bại và tránh chi phí cho các hoạt động I / O, thì đây là một cách đơn giản và nguyên bản để thực hiện nó (không sử dụng luồng). Node được thiết kế thành một luồng (tra cứu vòng lặp sự kiện), vì vậy hãy tránh sử dụng các luồng nếu có thể. Nếu giả định của tôi là đúng, tôi khuyên bạn nên sử dụng Promise.race
với setTimeout
(ví dụ trong liên kết). Với chiến lược này, bạn sẽ chạy một danh sách các lời hứa mà mỗi lần thử một số thao tác I / O và từ chối lời hứa nếu có lỗi (nếu không thì hết thời gian chờ). Các Promise.race
tuyên bố tiếp tục sau khi nghị quyết đầu tiên / từ chối, mà có vẻ là những gì bạn muốn. Hy vọng điều này sẽ giúp ai đó!
Node.js không sử dụng phân luồng. Theo nhà phát minh đó là một tính năng chính. Vào thời điểm phát minh ra nó, các chủ đề chậm, có vấn đề và khó khăn. Node.js được tạo ra là kết quả của cuộc điều tra về một giải pháp thay thế lõi đơn hiệu quả. Hầu hết những người đam mê Node.js vẫn trích dẫn lập luận cũ của bạn như thể các chủ đề không được cải thiện trong 50 năm qua.
Như bạn đã biết, Node.js được sử dụng để chạy JavaScript. Ngôn ngữ JavaScript cũng đã phát triển trong những năm qua. Bây giờ nó có các cách sử dụng nhiều lõi - tức là những gì Threads làm. Vì vậy, thông qua những tiến bộ trong JavaScript, bạn có thể thực hiện một số tác vụ đa lõi trong các ứng dụng của mình. user158 chỉ ra rằng Node.js đang chơi với nó một chút. Tôi không biết gì về điều đó. Nhưng tại sao phải đợi Node.js phê duyệt những gì JavaScript phải cung cấp.
Google cho JavaScript đa luồng thay vì đa luồng Node.js. Bạn sẽ tìm hiểu về Nhân viên web, Lời hứa và những thứ khác.