Cách tạo chuỗi trong nodejs


Câu trả lời:


94

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ác tiến trình có thể chạy song song và tuần tự tại một thời điểm?
user87267867

2
Các tiến trình con độc lập với tiến trình mẹ. Chúng có không gian bộ nhớ, PID và thời gian thực thi riêng. Không chắc bạn muốn nói gì về tuần tự, nhưng có, chúng sẽ chạy song song và được HĐH lập lịch riêng để thực thi.
Brian

làm thế nào để gọi các hàm do người dùng xác định là tiến trình con?
user87267867

Làm thế nào tôi có thể đẻ trứng một quá trình con để gọi hàm abc () {}
user87267867

2
Huh, không biết về thư viện đó nhưng có vẻ như theo nhận xét của Alex Mills, bạn có thể thực hiện một số công việc phân luồng trong Node. Điều đó đang được nói, câu hỏi tiếp theo là bạn có nên không. . . Nút được thiết kế từ đầu để giải phóng các lập trình viên khỏi sự phức tạp đi kèm với các luồng nhưng mang lại hiệu suất loại tương tự để chặn I / O. Tôi sẽ chỉnh sửa câu trả lời của mình cho phù hợp với thực tế là có thể sử dụng thư viện được tham chiếu.
Brian


18

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-workercờ.

Ghi chú phát hành: https://nodejs.org/en/blog/release/v11.7.0/


9

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. "



3

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 :

  • tiny-worker cho phép các công nhân sinh sản, nhưng họ dường như chia sẻ cùng một vòng lặp thông báo (nhưng có thể tôi đã làm sai điều gì đó - các chuỗi có nhiều tài liệu hơn cho tôi tin rằng nó thực sự sử dụng nhiều quy trình, vì vậy tôi tiếp tục cho đến khi nó hoạt động)
  • webworker-thread không cho phép requirecác mô-đun -ing trong worker mà tôi cần

Và đố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).


1
Tôi đánh giá cao ý nghĩ tuyệt vời được đưa vào câu trả lời này!
MLissCetrus

3

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 ES6worker_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

2
Đây có phải là bài viết của bạn: blog.logrocket.com/… ?
serv-inc

Không..không phải đâu ... tôi đã tham khảo nó ngược thời gian.
priyeshdkr



0

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.racevớ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.racetuyê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 đó!


2
Điều này không liên quan gì đến chủ đề. Tất cả chúng đều chạy trong cùng một chủ đề.
Evan Carroll

@EvanCarroll - Cảm ơn bạn đã cảnh báo cho tôi rằng tôi không đủ rõ ràng. Tôi đã mở đầu nó bằng một giả định về lý do tại sao ai đó có thể đang tìm kiếm luồng đua và lưu ý rằng điều này sử dụng các lời hứa trong vòng lặp sự kiện của Node. Đến từ một ngôn ngữ khác, rất có thể bạn muốn thực hiện những gì mà các chuỗi làm nhưng chưa quen với vòng lặp sự kiện hoặc các lời hứa. Tôi muốn lưu ý rằng có nhiều cách đơn giản hơn để đạt được điều đó nếu đó là mục tiêu của bạn. Tôi đã thêm một dấu ngoặc đơn rằng điều này không sử dụng chủ đề. Hãy cho tôi biết nếu điều này rõ ràng hơn.
smileham

Nó dường như cũng trả lời các tiêu chí OP: "Nếu bất kỳ phương thức nào không thành công ở giữa tất cả các luồng khác sẽ bị giết", vì vậy tôi nghĩ rằng nó có liên quan.
smileham

Promise.race thực hiện tuần tự tất cả các lời hứa, chuyển đổi từ lời hứa này sang lời hứa khác trong trường hợp hoạt động không đồng bộ (hoặc chờ đợi trong trường hợp hàm không đồng bộ).
Nagabhushan Baddi

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.