Threads.js
Chuyển các tác vụ tốn CPU sang các luồng công việc trong node.js, trình duyệt web và electron bằng cách sử dụng một API thống nhất.
Sử dụng các web worker trong trình duyệt, worker_threads
trong node 12+ và tiny-worker trong node 8 đến 11.
Tính năng
- Hỗ trợ lớp đầu tiên cho các hàm bất đồng bộ & các observables
- Viết mã một lần, chạy trên tất cả các nền tảng
- Quản lý thực hiện nhiệm vụ hàng loạt với thread pools
- Sử dụng require() và import / export trong các worker
- Hoạt động tốt với webpack
Phiên bản 0.x
Bạn có thể tìm phiên bản cũ 0.12 của threads.js tại v0 branch. Toàn bộ nội dung trang này liên quan đến phiên bản 1.0, một bản viết lại của thư viện với một API hoàn toàn mới.
Cài đặt
npm install threads tiny-worker
Bạn chỉ cần cài đặt_gói _tiny-worker_
để hỗ trợ node.js < 12. Đó là một phụ thuộc tùy chọn và được sử dụng như một lựa chọn dự phòng nếu _worker_threads_
không khả dụng.
Hỗ trợ nền tảng
Chạy trên node.js
Chạy mã sử dụng threads.js trên node hoạt động ngay lập tức.
Lưu ý rằng chúng tôi bọc Worker
nguyên bản, vì vậy new Worker("./foo/bar")
sẽ giải quyết đường dẫn liên quan đến module gọi nó, không phải liên quan đến thư mục làm việc hiện tại.
Điều này phù hợp với hành vi khi đóng gói mã với webpack hoặc parcel.
Cấu hình build với Webpack
Cấu hình Webpack
Sử dụng cùng với threads-plugin. Nó sẽ tự động phát hiện tất cả các biểu thức new Worker("./unbundled-path")
, gói gọn mã worker và thay thế đường dẫn new Worker(...)
bằng đường dẫn bundle của worker, để bạn không cần phải sử dụng rõ ràng worker-loader
hoặc định nghĩa thêm các điểm nhập.
npm install -D threads-plugin
Sau đó thêm nó vào webpack.config.js
của bạn:
+ const ThreadsPlugin = require('threads-plugin');
module.exports = {
// ...
plugins: [
+ new ThreadsPlugin()
]
// ...
}
Các bundles Node.js
Nếu bạn đang sử dụng webpack để tạo một bundle sẽ chạy trong node (cấu hình webpack target: "node"
), bạn cũng cần chỉ định rằng gói tiny-worker
được sử dụng cho node < 12 không nên được gói gọn:
module.exports = {
// ...
+ externals: {
+ "tiny-worker": "tiny-worker"
+ }
// ...
}
Hãy đảm bảo rằng tiny-worker
đã được liệt kê trong dependencies
của package.json
trong trường hợp này.
Khi sử dụng TypeScript
Lưu ý: Bạn cần sử dụng phiên bản TypeScript 4+ vì các loại dữ liệu được tạo ra bởi threads.js không được hỗ trợ trong TypeScript 3.
Đảm bảo trình biên dịch TypeScript giữ lại các câu lệnh import
/ export
, để webpack giải quyết chúng. Nếu không, threads-plugin
sẽ không thể hoạt động.
module.exports = {
// ...
module: {
rules: [
{
test: /\.ts$/,
loader: "ts-loader",
+ options: {
+ compilerOptions: {
+ module: "esnext"
+ }
+ }
}
]
},
// ...
}
Cài đặt trình bundler Parcel
Bạn cần nhập threads/register
một lần ở đầu mã ứng dụng của bạn (trong mã chính, không phải trong các worker):
import { spawn } from "threads"
+ import "threads/register"
// ...
const work = await spawn(new Worker("./worker"))
Điều này đăng ký Worker
của thư viện cho nền tảng của bạn như là Worker
toàn cục. Điều này là cần thiết, vì bạn không thể import { Worker } from "threads"
hoặc Parcel sẽ không nhận dạng new Worker()
như một web worker nữa.
Hãy nhớ rằng điều này có thể ảnh hưởng đến bất kỳ mã nào cố gắng khởi tạo một Worker
web worker thông thường và bây giờ thay vào đó khởi tạo một Worker
threads.js. Worker
của threads.js chỉ là một web worker với một số đường dẫn đơn giản, nhưng đường dẫn đơn giản này có thể gây ra những tác động phụ không mong muốn đối với các thư viện bên thứ ba.
Mọi thứ khác nên hoạt động ngay lập tức.
Bắt đầu
Cơ bản
// master.js
import { spawn, Thread, Worker } from "threads"
const auth = await spawn(new Worker("./workers/auth"))
const hashed = await auth.hashPassword("Super secret password", "1234")
console.log("Hashed password:", hashed)
await Thread.terminate(auth)
// workers/auth.js
import sha256 from "js-sha256"
import { expose } from "threads/worker"
expose({
hashPassword(password, salt) {
return sha256(password + salt)
}
})
spawn()
Hàm hashPassword()
của đối tượng auth
trong mã gốc sẽ gọi hàm hashPassword()
trong công việc:
Nếu hàm của công việc trả về một promise hoặc một observable, bạn có thể sử dụng giá trị trả về như thế trong mã gốc. Nếu hàm trả về một giá trị nguyên thủy, hãy chờ đợi hàm gốc trả về một promise giải quyết thành giá trị đó.
expose()
Sử dụng expose()
để làm cho một hàm hoặc một đối tượng chứa các phương thức có thể được gọi từ luồng chính.
Trong trường hợp của việc tiết lộ một đối tượng, spawn()
sẽ bất đồng bộ trả về một đối tượng tiết lộ tất cả các chức năng của đối tượng. Nếu bạn expose()
một hàm, spawn
cũng sẽ trả về một hàm có thể gọi, không phải là một đối tượng.
Cách Sử Dụng
Tìm tài liệu đầy đủ trên website:
Webpack
Threads.js hoạt động với webpack. Thông thường, bạn chỉ cần thêm threads-plugin.
Xem chi tiết tại Build with webpack trên trang web.
Gỡ lỗi
Chúng tôi đang sử dụng gói debug để cung cấp ghi nhật ký gỡ lỗi theo yêu cầu. Tất cả các thông báo gỡ lỗi của gói đều có phạm vi bắt đầu bằng threads:
, với các phạm vi con khác nhau:
threads:master:messages
threads:master:spawn
threads:master:thread-utils
threads:pool:${poolName || poolID}
Đặt nó thành DEBUG=threads:*
để kích hoạt tất cả ghi nhật ký gỡ lỗi của thư viện. Để chạy các kiểm tra với ghi nhật ký gỡ lỗi đầy đủ, ví dụ:
DEBUG=threads:* npm test
Chi Tiết Tải Xuống:
Tác giả: andywer
Mã nguồn: https://github.com/andywer/threads.js
Giấy phép: MIT license