Concurrency vs Parallelism
เข้าใจความต่างของ "ทำสลับกัน" กับ "ทำพร้อมกันจริง" และเลือกเครื่องมือให้ถูกกับงาน
เมื่อโปรแกรมต้องทำหลายอย่าง การทำให้เร็วขึ้นด้วยการทำพร้อมกันเป็นทักษะสำคัญ แต่ "พร้อมกัน" มีหลายแบบ และเลือกผิดเครื่องมืออาจไม่เร็วขึ้นเลย หัวข้อนี้ปูพื้นให้เลือกถูก
Concurrency vs Parallelism
| Concurrency | Parallelism | |
|---|---|---|
| ความหมาย | สลับทำหลายงาน | ทำหลายงานพร้อมกันจริง |
| เปรียบเทียบ | เชฟคนเดียวสลับทำหลายจาน | เชฟหลายคนทำคนละจาน |
| ต้องใช้ | งานสลับได้ (รอ I/O) | หลาย CPU core |
I/O-bound vs CPU-bound (ตัวกำหนดเครื่องมือ)
ก่อนเลือกเครื่องมือ ต้องรู้ว่างานของเราติดที่อะไร — รอข้อมูล (I/O) หรือคำนวณหนัก (CPU)
| ชนิดงาน | ติดที่ | ตัวอย่าง | เครื่องมือ |
|---|---|---|---|
| I/O-bound | รอ network/ดิสก์ | เรียก API หลายตัว, อ่านไฟล์ | threading / asyncio |
| CPU-bound | คำนวณหนัก | ประมวลผลภาพ, คำนวณเลขเยอะ | multiprocessing |
งาน I/O-bound (รอเยอะ) ใช้ threading/asyncio ได้ผลดี เพราะระหว่างรอตัวหนึ่ง ทำตัวอื่นได้; แต่งาน CPU-bound ต้องใช้ multiprocessing เพราะ threading ใน Python ไม่ช่วย (เพราะ GIL — หัวข้อถัดไป) เข้าใจจุดนี้ก่อนเขียนโค้ด
สรุปหัวข้อนี้
- concurrency = สลับทำ; parallelism = ทำพร้อมกันจริง (ต้องหลาย core)
- I/O-bound (รอ network/ดิสก์) → threading / asyncio
- CPU-bound (คำนวณหนัก) → multiprocessing
- เลือกผิดชนิด = ไม่เร็วขึ้น (หรือช้าลง)
1) จำแนกว่าเป็น I/O-bound หรือ CPU-bound: ดาวน์โหลด 100 ไฟล์ / คำนวณ prime ล้านตัว / อ่าน DB / resize รูป 1000 รูป 2) อธิบาย concurrency vs parallelism ด้วยตัวอย่างของตัวเอง 3) บอกว่างานในข้อ 1 ควรใช้เครื่องมือไหน