Saturday, February 21, 2026

Đa luồng (Multi-threading) và Đa tiến trình (Multi-processing)

Trong thế giới lập trình, chúng ta thường nghe về việc làm sao để chương trình chạy nhanh hơn, xử lý được nhiều việc cùng lúc hơn. Hai khái niệm "đinh" mà bất kỳ developer nào cũng cần nắm vững chính là Multi-threadingMulti-processing.

Nhưng chúng khác nhau thế nào? Khi nào dùng cái nào? Hãy cùng mình giải mã qua ví dụ về một "Nhà hàng lẩu" nhé!

Introduction to Multithreading and Multiprocessing in Python - KDnuggets 

1. Khái niệm cơ bản qua lăng kính thực tế

 

Hãy tưởng tượng một Tiến trình (Process) giống như một Nhà hàng. Trong nhà hàng đó có không gian, bếp, nguyên liệu và các nhân viên.

  • Đa tiến trình (Multi-processing): Giống như việc bạn mở nhiều nhà hàng khác nhau. Mỗi nhà hàng có khu bếp riêng, kho nguyên liệu riêng. Nếu một nhà hàng bị cháy, các nhà hàng khác vẫn hoạt động bình thường.

  • Đa luồng (Multi-threading): Giống như việc trong cùng một nhà hàng, bạn thuê nhiều nhân viên (luồng) cùng làm việc. Họ dùng chung bếp, chung kho nguyên liệu và hỗ trợ lẫn nhau.


2. Đa luồng (Multi-threading): Hiệp đồng tác chiến

 

Trong một Tiến trình, các Luồng (Threads) chia sẻ chung vùng nhớ (Memory).

  • Ưu điểm: Khởi tạo rất nhanh, tiêu tốn ít tài nguyên và việc chia sẻ dữ liệu giữa các luồng cực kỳ dễ dàng (vì dùng chung "kho").

  • Nhược điểm: Vì dùng chung đồ nên nếu không khéo sẽ xảy ra tranh chấp (Race condition). Đặc biệt với Python, chúng ta có "ông bảo vệ" GIL (Global Interpreter Lock) chỉ cho phép một luồng thực thi mã Python tại một thời điểm.

  • Ví dụ trực quan: Một nhân viên bưng phở, một nhân viên dọn bàn, một nhân viên thu ngân. Tất cả làm việc trong cùng một mặt bằng.


3. Đa tiến trình (Multi-processing): Độc lập tác chiến

 

Mỗi Tiến trình có một vùng không gian bộ nhớ hoàn toàn độc lập.

  • Ưu điểm: Tận dụng tối đa sức mạnh của CPU nhiều nhân (Multi-core). Nếu một tiến trình bị "treo", nó không kéo theo các tiến trình khác chết chung. Không bị ảnh hưởng bởi GIL trong Python.

  • Nhược điểm: Tốn tài nguyên hơn (mở thêm nhà hàng mới luôn đắt đỏ hơn thuê thêm nhân viên). Việc trao đổi dữ liệu giữa các tiến trình (IPC) cũng phức tạp hơn.

  • Ví dụ trực quan: Bạn mở 3 chi nhánh nhà hàng tại 3 quận khác nhau.


4. Bảng so sánh nhanh

 

Đặc điểmĐa luồng (Multi-threading)Đa tiến trình (Multi-processing)
Bộ nhớDùng chung (Shared Memory)Độc lập (Isolate Memory)
Tốc độ tạoNhanhChậm hơn
Tài nguyênThấpCao
Độ an toànDễ gây lỗi dữ liệu nếu không khóa (Lock)An toàn, độc lập cao
Phù hợp nhấtCác tác vụ chờ đợi (I/O Bound) như: Gọi API, đọc ghi file, truy vấn DB.Các tác vụ tính toán nặng (CPU Bound) như: Xử lý ảnh, Video, Training AI.

5. Lời kết: Nên chọn "Phe" nào?

 

  • Nếu bạn đang làm một ứng dụng FastAPI cần xử lý nhiều yêu cầu gọi đến database hoặc API bên thứ ba: Multi-threading (hoặc AsyncIO) là chân ái.

  • Nếu bạn đang viết script để xử lý hàng triệu bản ghi, tính toán ma trận phức tạp, hoặc training model, hãy gọi tên Multi-processing để tận dụng hết các nhân CPU đang "ngủ quên" của bạn.

No comments:

Post a Comment