Đa luồng cho zip trong nodejs


8

Hoạt động zip và giải nén có thể được thực hiện đa luồng trong nodejs không?

Có một loạt các mô-đun như yauzl, nhưng không sử dụng nhiều luồng và bạn không thể tự khởi động nhiều luồng với cụm nút hoặc một cái gì đó tương tự, bởi vì mỗi tệp zip phải được xử lý trong một luồng


Về cơ bản, bạn cần một thư viện với một mô-đun gốc có quyền truy cập vào các chủ đề. Kiến trúc nút cho phép các mô-đun này có quyền truy cập vào các chủ đề.
Sn0bli

Trong Node v10.5.0, Bạn có thể sử dụng cờ --experimental-worker cho "Đa luồng" thông qua các luồng công nhân và trong Node v11.7.0, họ đã hiển thị các công nhân theo mặc định và họ đã xóa cờ, nodejs.org/en/blog/ phát hành / v11.7.0 nodejs.org/en/blog/release/v10.5.0 , Bạn có thể kiểm tra các ví dụ Medium.com/@Trott/USE-worker-threads-in-node-js-80494136dbb6
redhatvicky

Câu trả lời:


5

Theo tài liệu của Zlib

Sử dụng Threadpool: Tất cả các API zlib, ngoại trừ các API được đồng bộ hóa rõ ràng, đều sử dụng threadpool của libuv. Điều này có thể dẫn đến các hiệu ứng đáng ngạc nhiên trong một số ứng dụng, chẳng hạn như hiệu suất phụ (có thể được giảm thiểu bằng cách điều chỉnh kích thước nhóm) và / hoặc không thể phục hồi và phân mảnh bộ nhớ thảm khốc. https://nodejs.org/api/zlib.html#zlib_threadpool_usage

Theo luồng của libuv, bạn có thể thay đổi biến môi trường UV_THREADPOOL_SIZEđể thay đổi kích thước tối đa

Thay vào đó, nếu bạn muốn nén nhiều tệp nhỏ cùng một lúc, bạn có thể sử dụng Chủ đề Công nhân https://nodejs.org/api/worker_threads.html

Khi đọc lại câu hỏi của bạn, có vẻ như bạn muốn nhiều tệp. Sử dụng Chủ đề Công nhân, những chủ đề này sẽ không chặn chủ đề chính của bạn và bạn có thể lấy lại đầu ra từ chúng thông qua các lời hứa.


2

Node JS sử dụng Libuv và luồng công nhân. Chủ đề công nhân là một cách để thực hiện hoạt động theo cách đa luồng. Trong khi bằng cách sử dụng libuv (nó duy trì luồng trong nhóm luồng), bạn có thể tăng luồng của máy chủ js nút mặc định. Bạn có thể sử dụng cả hai để cải thiện hiệu suất js nút cho hoạt động của mình.

Vì vậy, đây là tài liệu chính thức cho chủ đề công nhân: https://nodejs.org/api/worker_threads.html

Xem cách bạn có thể tăng nhóm luồng trong nút js tại đây: in kích thước luồng libuv trong nút js 8


1

Trợ giúp về cách thực hiện đa luồng trong nút js. Bạn sẽ phải tạo ba tập tin dưới đây

index.mjs

import run from './Worker.mjs';

/**
* design your input list of zip files here and send them to `run` one file name at a time
* to zip, using a loop or something. It acts as promise.
* exmaple : run( <your_input> ).then( <your_output> );
**/

Công nhân.mjs

import { Worker } from 'worker_threads';

function runService(id, options) {
    return new Promise((resolve, reject) => {
        const worker = new Worker('./src/WorkerService.mjs', { workerData: { <your_input> } });
        worker.on('message', res => resolve({ res: res, threadId: worker.threadId }));
        worker.on('error', reject);
        worker.on('exit', code => {
            if (code !== 0)
                reject(new Error(`Worker stopped with exit code ${code}`));
        });
    });
}

async function run(id, options) {
    return await runService(id, options);
}

export default run;

WorkerService.mjs

import { workerData } from 'worker_threads';

// Here goes your logic for zipping a file, where as `workerData` will have <your_input>.

Hãy cho tôi biết nếu nó giúp.


1

Hoạt động zip và giải nén có thể được thực hiện đa luồng trong nodejs không?

Đúng.

... và bạn không thể tự bắt đầu nhiều luồng ... vì mỗi tệp zip phải được xử lý trong một luồng

Tôi nghi ngờ tiền đề của bạn là bị lỗi. Tại sao chính xác bạn nghĩ rằng một quá trình nút có thể bắt đầu nhiều luồng? Đây là một ứng dụng tôi đang chạy đang sử dụng mô đun cụm node.js rất trưởng thành với quy trình cha mẹ đóng vai trò là người giám sát và hai quy trình con thực hiện các tác vụ ràng buộc I / O của mạng và đĩa.

đầu ra hàng đầu hiển thị các quá trình node.js bằng cách sử dụng các luồng CPU

Như bạn có thể thấy trong Ccột, mỗi quá trình đang chạy trên một luồng riêng biệt. Điều này cho phép tiến trình chủ vẫn đáp ứng cho các tác vụ lệnh và điều khiển (như sinh sản / gặt hái công nhân) trong khi các tiến trình worker bị ràng buộc CPU hoặc đĩa. Máy chủ đặc biệt này chấp nhận các tệp từ mạng, đôi khi giải nén chúng và cung cấp cho chúng thông qua các bộ xử lý tệp bên ngoài. IOW, đây là một nhiệm vụ bao gồm nén như bạn mô tả.

Tôi không chắc chắn bạn muốn sử dụng các luồng công nhân dựa trên đoạn trích này từ các tài liệu :

Công nhân (luồng) rất hữu ích để thực hiện các hoạt động JavaScript chuyên sâu của CPU. Họ sẽ không giúp được gì nhiều cho công việc chuyên sâu I / O. Các hoạt động I / O không đồng bộ tích hợp sẵn của Node.js hiệu quả hơn so với Công nhân có thể.

Đối với tôi, mô tả đó hét lên, "crypo!" Trước đây, tôi đã sinh ra các quy trình con khi phải thực hiện bất kỳ thao tác crypo đắt tiền nào.

Trong một dự án khác, tôi sử dụng mô đun child_ process của nút và khởi động một tiến trình con mới mỗi lần tôi có một lô tệp để nén. Dịch vụ cụ thể đó thấy một danh sách ~ 400 tệp có tên như process-me-2019.11.DD.MMvà ghép chúng thành một process-me-2019-11-DDtệp duy nhất . Phải mất một thời gian để nén để sinh ra một quy trình mới tránh bị chặn trên luồng chính.


Một quy trình nút có thể bắt đầu nhiều luồng, nhưng vì chúng không chia sẻ cùng một mã và các biến nên bạn không thể sử dụng các luồng này để nén cùng một tệp hoặc trích xuất từ ​​cùng một tệp. Làm cách nào tôi có thể trích xuất từ ​​một zip bằng nhiều luồng mà không cần mở cùng một tệp trong mỗi luồng?
Alex

OIC, bạn muốn sử dụng nhiều luồng để [de] nén một tệp. Gần nhất bạn có thể nhận được đó là sinh ra một quy trình bên ngoài chạy một tiện ích nén song song như pigz . Hay bạn muốn một kho lưu trữ duy nhất được mở và có các quy trình nút khác có thể đọc từ nó (sử dụng IPC)?
Matt Simerson

0

Không có cách nào bạn có thể thực hiện đa luồng trong Nodej thuần cho đến khi bạn sử dụng bất kỳ thư viện của bên thứ ba nào. Bạn có thể thực hiện quá trình song song bằng cách sử dụng lời hứa. Nếu bạn không muốn quá tải luồng chính mà nút sử dụng thì bạn có thể triển khai RabitMQ (Redis Queue). Nó sẽ chạy trong luồng riêng của nó để luồng chính của bạn sẽ không bao giờ bị chặn.


Điều này là không chính xác. Nodejs cho phép Chủ đề Công nhân. Đọc thêm tại đây: nodejs.org/api/worker_threads.html
Strike Eagle

Công nhân không đa luồng thay vào đó nó thực thi trong một quy trình hoàn toàn khác. RabitMQ (bản thiết kế của công nhân nhưng có rất nhiều khả năng)
Sudhir Roy

"Về mặt kỹ thuật", vào cuối ngày, nó cung cấp cho bạn khả năng tương tự, để thực hiện các hướng dẫn trên một luồng khác nhau và nhận đầu ra.
Strike Eagle
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.