ข้ามไปยังเนื้อหา

Web Workers & SharedWorker

JavaScript ทำงานแบบ single-threaded นั่นคือ ทุกสคริปต์ การอัปเดต DOM การคำนวณ layout และ event handler ล้วนทำงานบนเธรดเดียวกัน เมื่อรัน computation ที่หนัก เช่น การ parse ไฟล์ขนาดใหญ่ การคำนวณ hash หรือการประมวลผลภาพ UI จะ “แช่แข็ง” ตลอดช่วงเวลานั้น — scroll หยุด animation กระตุก และ click ไม่ตอบสนอง

Web Workers ช่วยให้โยนงานหนักไปยัง background thread ได้ browser จะสร้าง JS environment แยกต่างหากพร้อม event loop ของตัวเอง เธรดหลักและ worker สื่อสารกันผ่าน postMessage และ onmessage โดยค่าเริ่มต้นทั้งสองเธรดจะไม่แชร์ memory ดังนั้นจึงไม่มีปัญหา race condition

flowchart LR
  MT["Main Thread
(UI, events)"]
  DW["Dedicated Worker
(background JS)"]
  MT -- "worker.postMessage(data)" --> DW
  DW -- "self.postMessage(result)" --> MT
เธรดหลัก ↔ Dedicated Worker ผ่าน postMessage/onmessage
Dedicated WorkerSharedWorker
ขอบเขตหนึ่งแท็บ / หนึ่งสคริปต์ทุกแท็บของ origin เดียวกัน
Constructornew Worker(url)new SharedWorker(url)
การสื่อสารDirect: worker.postMessage(data)ผ่าน MessagePort: port.postMessage(data)
ฝั่ง Workerself.onmessage = fnต้องจัดการ onconnect ก่อน แล้วฟัง event.ports[0]
ความซับซ้อนง่ายปานกลาง — ต้องดูแล port
กรณีใช้งานงาน CPU หนักในแท็บเดียวShared cache, ประสานงานข้ามแท็บ
บทเรียนสิ่งที่จะได้เรียนรู้
index (หน้านี้)ภาพรวม, Dedicated vs Shared, แผนผังโมดูล
web-workersสร้าง ส่งข้อความ และยกเลิก Dedicated Worker
postmessage-and-transferablesStructured clone vs zero-copy transferables
sharedworkerเชื่อมต่อหลายแท็บกับ SharedWorker เดียว
worker-patternsError handling, worker pools, และ best practices

snippet ด้านล่างสร้าง Dedicated Worker ผ่าน Blob URL ส่งตัวเลข 10 และ worker จะคำนวณ Fibonacci แบบ off-thread แล้วส่งผลลัพธ์กลับมา

Browser Storage
เหตุผลหลักในการย้ายงานไปยัง Web Worker คืออะไร?
Worker ประเภทใดที่แชร์ข้ามทุกแท็บของ origin เดียวกัน?
main thread และ worker สื่อสารกันอย่างไร?