---
# System prepended metadata

title: '今週何知った？ week:15'

---

# 今週何知った？ week:15

[![hackmd-github-sync-badge](https://hackmd.io/CFlTER5rRHy37AW44sisZw/badge)](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]

![](https://i.imgur.com/PUt0YNj.png)

## メモ欄
