🟢 Concurrency (Đồng thời)
Nhiều tasks tiến triển cùng nhau bằng cách chuyển ngữ cảnh (interleaving). Không nhất thiết chạy cùng lúc.
🟣 Parallelism (Song song)
Nhiều tasks chạy thật sự cùng lúc trên nhiều CPU cores. Yêu cầu hardware hỗ trợ.
1. Ví Dụ Dễ Hiểu
🍳 Ví dụ nấu ăn:
Concurrency = 1 đầu bếp, nấu 3 món: chiên trứng → đợi → rửa rau → đợi → khuấy
canh → quay lại chiên trứng... Chuyển qua lại giữa các việc.
Parallelism = 3 đầu bếp: người 1 chiên trứng, người 2 rửa rau, người 3 nấu
canh. Cùng lúc, thật sự đồng thời.
2. Concurrency — Rob Pike's Definition
"Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once." — Rob Pike (creator of Go)
Concurrency (1 CPU core):
Timeline: ──────────────────────────────────→
Core 1: [Task A][Task B][Task A][Task C][Task B][Task A]
← chuyển qua lại (context switch) →
→ Chỉ 1 task chạy tại mỗi thời điểm
→ Nhưng tất cả đều "tiến triển"
// Node.js = Concurrency (single thread, event loop)
// 3 tasks "cùng lúc" nhưng chỉ 1 thread
async function concurrentExample() {
// 3 API calls bắt đầu cùng lúc
const [users, orders, products] = await Promise.all([
fetch('/api/users'), // gửi request → đợi (non-blocking)
fetch('/api/orders'), // gửi request → đợi (non-blocking)
fetch('/api/products'), // gửi request → đợi (non-blocking)
]);
// ↑ 1 thread xử lý, nhưng 3 requests tiến triển concurrent
// → Tổng thời gian ≈ max(3 requests), không phải sum(3 requests)
}
3. Parallelism
Parallelism (4 CPU cores):
Timeline: ──────────────────────────────────→
Core 1: [Task A][Task A][Task A][Task A]
Core 2: [Task B][Task B][Task B][Task B]
Core 3: [Task C][Task C][Task C][Task C]
Core 4: [Task D][Task D][Task D][Task D]
→ 4 tasks chạy THẬT SỰ cùng lúc
→ Cần multi-core hardware
// Go = Concurrency + Parallelism
// Goroutines: concurrent by default, parallel nếu có nhiều cores
package main
import (
"fmt"
"sync"
"runtime"
)
func main() {
runtime.GOMAXPROCS(4) // Dùng 4 cores
var wg sync.WaitGroup
tasks := []string{"API call", "Image resize", "DB query", "File read"}
for _, task := range tasks {
wg.Add(1)
go func(t string) { // goroutine → có thể chạy parallel
defer wg.Done()
fmt.Println("Processing:", t)
// CPU-bound work → chạy song song trên multiple cores
}(task)
}
wg.Wait()
}
4. Bảng So Sánh
| Tiêu chí | 🟢 Concurrency | 🟣 Parallelism |
|---|---|---|
| Định nghĩa | Dealing with many things | Doing many things |
| CPU cores | 1 core đủ | Cần nhiều cores |
| Cơ chế | Context switching, interleaving | Thật sự chạy cùng lúc |
| Tốt cho | I/O-bound (network, disk) | CPU-bound (tính toán) |
| Ví dụ | Node.js event loop, async/await | Go goroutines, Java threads |
| Quan hệ | Parallelism ⊂ Concurrency (parallel luôn concurrent, nhưng concurrent chưa chắc parallel) | |
5. Khi Nào Dùng?
Concurrency cho I/O-bound: Web server, API calls, database queries, file I/O →
nhiều thời gian đợi → chuyển task khác.
Parallelism cho CPU-bound: Image processing, video encoding, machine learning,
data analysis → cần sức mạnh tính toán.