# 今週何知った? week:15 [](https://hackmd.io/CFlTER5rRHy37AW44sisZw) > [name=makicamel] ## マルチスレッド メインスレッドに対しサブスレッドのことを「ワーカー」と呼ぶ `worker_thread` モジュール:マルチスレッドのための機能を提供するコア API - メインスレッド - [`Worker()`](https://developer.mozilla.org/ja/docs/Web/API/Worker/Worker) ワーカーコンストラクタでワーカーを作成する - [`Worker.prototype.postMessage`](https://developer.mozilla.org/ja/docs/Web/API/Worker/postMessage) メインスレッドからワーカーにデータを送信する - ワーカー - [`parentPort`](https://nodejs.org/api/worker_threads.html#workerparentport) オブジェクト - `parentPort.on` でイベントハンドラを登録する - `parentPort.postMessage` でワーカーからメインスレッドにデータを送信する ref https://github.com/makicamel/til/tree/bbed052/books/hands_on_nodejs/part4/multi-thread ## スレッドプール - マルチスレッドにすると必ずパフォーマンスが改善するというわけではない - e.g. [リクエストの度に新しいスレッドを生成する](https://github.com/makicamel/til/tree/bbed052/books/hands_on_nodejs/part4/multi-thread) とスレッド生成のオーバーヘッドがマルチスレッド化によるメリットを上回る - マルチスレッドでの処理が継続的に発生する場合はスレッドをプールするとパフォーマンスが向上する ref https://github.com/makicamel/til/tree/c6065f7/books/hands_on_nodejs/part4/multi-thread-pool ## スレッド間での値の転送・共有 - 転送 - `postMessage` や `Worker` のインスタンス化時に転送対象のオブジェクトを指定するとコピーではなく値が渡される - 値の所有権も他スレッドに渡されるため、元スレッドでは該当オブジェクトを利用できなくなる - 値のコピーによるオーバーヘッドが生じないため、大きなオブジェクトを渡す際にパフォーマンス面でメリットがある - 共有 - Node.js では `worker_threads` で生成するスレッドは独立性が高いものとして設計されている - マルチスレッドプログラミングの、スレッド間の値の共有による複雑性を排除するため - スレッド間で値を共有したい場合の仕組みも準備されている - レースコンディションを防ぎ共有している値をスレッドセーフに扱うための [`Atomics`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Atomics) というグローバルオブジェクトも準備されている > [name=ken3ypa]  ## メモ欄
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up