Slide 1

Slide 1 text

探求発表会 in Cybozu Frontend Monthly#48 Node.jsの Worker threadsの話

Slide 2

Slide 2 text

なぜWorker threads? ナニモワカラナイ...

Slide 3

Slide 3 text

Q: なぜWorker threads? A: Vitestで使われてたから

Slide 4

Slide 4 text

Vitest runs tests in pools. By default, there are several poolsÇ 0 `threads` to run tests using `node:worker_threads` (isolation is provided with a new worker context 0 `forks` to run tests using `node:child_process` (isolation is provided with a new `child_process.fork` process) https://github.com/vitest-dev/vitest/blob/471cf97b0c00621d74bf9b880d02e293146b2290/docs/advanced/pool.md?plain=1#L9 Q: なぜWorker threads?

Slide 5

Slide 5 text

Worker threadsって何? ナニモワカラナイ...

Slide 6

Slide 6 text

Q: Worker threadsって何? A: ワカラナイ...

Slide 7

Slide 7 text

ということで Worker threadsを探求してみた ナニモワカラナイ...

Slide 8

Slide 8 text

Worker threadsとは The node:worker_threads module enables the use of threads that execute JavaScript in parallel. node:worker_threadsモジュールを使うことで、 JavaScriptを するスレッドを作成できる 並列で実行 https://nodejs.org/api/worker_threads.html#worker-threads

Slide 9

Slide 9 text

そもそもNode.jsで並列処理って? ナニモワカラナイ...

Slide 10

Slide 10 text

標準モジュールでできる並列処理 マルチスレッド worker_threads child_process cluster マルチプロセス コレイガイニアッタラオシエテネ

Slide 11

Slide 11 text

Vitestでの並列処理って? ナニモワカラナイ...

Slide 12

Slide 12 text

Q: Vitestでの並列処理って? A: 複数のスレッドやプロセスで テストを並列で実行する

Slide 13

Slide 13 text

By default Vitest runs test files in multiple threads using `node:worker_threads` via Tinypool (a lightweight fork of Piscina), allowing tests to run simultaneously. デフォルトだと、Vitestはnode:worker_threadsを使いマルチスレッ ドで並列にテストを実行する。 https://github.com/vitest-dev/vitest/blob/471cf97b0c00621d74bf9b880d02e293146b2290/docs/guide/features.md?plain=1#L35 意訳ネ Q: Vitestでの並列処理って?

Slide 14

Slide 14 text

node:worker_threads ナニモワカラナイ...

Slide 15

Slide 15 text

node:worker_threads メインスレッド

Slide 16

Slide 16 text

node:worker_threads メインスレッド Web Workerに似てる

Slide 17

Slide 17 text

node:worker_threads ./worker.js

Slide 18

Slide 18 text

node:worker_threads ./worker.js スレッド間の通信は以下の方法があD P parentPort: 親スレッドとの通0 P MessageChannel: 1対1のスレッド間の通0 P BroadcastChannel: 1対多のスレッド間の通信 MessageChannelとBroadcastChannelはHTML Living Standardで仕様が定められている

Slide 19

Slide 19 text

By default Vitest runs test files in multiple threads using `node:worker_threads` via (a lightweight fork of Piscina), allowing tests to run simultaneously. Tinypool https://github.com/vitest-dev/vitest/blob/471cf97b0c00621d74bf9b880d02e293146b2290/docs/guide/features.md?plain=1#L35 ナニモワカラナイ

Slide 20

Slide 20 text

Tinypool https://github.com/tinylibs/tinypool

Slide 21

Slide 21 text

the node.js worker pool? ナニモワカラナイ...

Slide 22

Slide 22 text

Worker threadsを効率に管理するための仕組み。 あらかじめ、いくつかのスレッドをpoolに確保しておき、 タスクが来たら、空いてるworkerにそのタスクを割り当てる。 workerがタスクを完了させたら、再びpoolに戻り、 次のタスクを待つ。 Q: worker poolって何?

Slide 23

Slide 23 text

2 Vitestではテストを並列で実行するのにWorker threadsが使われて いH 2 Tinypoolを使ってテスト実行に使うスレッドを効率的に管理してい H 2 Worker threadsはWeb Workerみたいに実装できH 2 マルチスレッド→worker_thread` 2 マルチプロセス→child_process、cluster 探求まとめ