⚡ Concurrency vs Parallelism

Đồng thời (1 core, chuyển ngữ cảnh) vs Song song (nhiều cores, chạy cùng lúc)

🟢 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.