PYTHON CONCURRENCY
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Sự khác biệt giữa các Processes and Threads

Trong lập trình và kỹ thuật máy tính, hiểu rõ về các tiến trình (process) và luồng (thread) là điều vô cùng quan trọng để tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả. Hai khái niệm này, mặc dù thường bị nhầm lẫn, nhưng lại có vai trò và cách thức hoạt động khác nhau trong hệ thống. Trong bài viết này, bạn sẽ tìm hiểu về các Processes and Threads, cũng như các điểm khác biệt chính giữa chúng, giúp bạn có cái nhìn tổng quan và sâu sắc hơn về cách mà các chương trình hoạt động trên máy tính.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về các Processes and Threads trong Python

Giả sử bạn có một chương trình Python đơn giản:

x = 10
y = 20
z = x + y

Máy tính không hiểu Python. Chúng chỉ hiểu mã máy, là tập hợp các lệnh chứa số 0 và 1.

Do đó, bạn cần một Trình thông dịch Python (Python Interpreter) để thực thi chương trình Python này, nó sẽ dịch mã Python sang mã máy.

Bài viết này được đăng tại [free tuts .net]

Khi bạn thực hiện lệnh python app.py, trình thông dịch Python (CPython) biên dịch file app.py thành mã máy. Sau đó, hệ điều hành (OS) cần tải chương trình vào bộ nhớ (RAM) để chạy chương trình.

Khi OS tải chương trình vào bộ nhớ, nó sẽ di chuyển các lệnh đến CPU để thực thi thông qua bus.

Nói chung, OS di chuyển các lệnh vào một hàng đợi, còn được gọi là pipeline. Sau đó, CPU sẽ thực thi các lệnh từ pipeline.

Theo định nghĩa, một processes là một phiên bản của một chương trình đang chạy trên máy tính. Và một luồng là một đơn vị thực thi trong một tiến trình.

Lưu ý rằng nếu bạn khởi chạy một chương trình nhiều lần, bạn sẽ có một chương trình duy nhất nhưng nhiều processes , mỗi tiến trình đại diện cho một phiên bản của chương trình.

Một chương trình giống như một lớp trong khi các processes giống như các đối tượng của lớp đó.

Hình ảnh sau minh họa luồng của việc chạy một chương trình Python trên máy tính:

Difference between process and thread Executing Processes png

Sự khác biệt giữa các Processes and Threads trong Python

Thực thi CPU đơn lõi

Cho đến nay, bạn đã học cách phát triển một chương trình có một tiến trình với một luồng. Do đó, đôi khi các thuật ngữ Processes and Threads thường được sử dụng thay thế cho nhau.

Một chương trình có thể có một hoặc nhiều tiến trình và một tiến trình có thể có một hoặc nhiều luồng.

Khi một chương trình có nhiều tiến trình, nó được gọi là xử lý đa tiến trình (multiprocessing). Nếu một chương trình có nhiều luồng, nó được gọi là xử lý đa luồng (multithreading).

Bộ xử lý đơn lõi

Trong quá khứ, một CPU chỉ có một lõi. Nói cách khác, nó chỉ có thể chạy một tiến trình tại một thời điểm. Để thực thi nhiều tiến trình "cùng một lúc", OS sử dụng một thành phần phần mềm gọi là bộ lập lịch (scheduler):

Difference between process and thread Scheduler png

Bộ lập lịch giống như một công tắc chuyển đổi các tiến trình. Nhiệm vụ chính của bộ lập lịch là chọn các lệnh và gửi chúng để thực thi đều đặn.

Bộ lập lịch chuyển đổi giữa các tiến trình nhanh chóng (khoảng 1 ms) đến mức tạo ra ảo giác rằng máy tính có thể thực thi nhiều tiến trình đồng thời.

Bộ xử lý đa lõi

Ngày nay, CPU thường có nhiều lõi, ví dụ, hai lõi (dual-core) và bốn lõi (quad-core).

Số lượng lõi sẽ xác định số lượng tiến trình mà CPU có thể thực thi đồng thời. Nói chung, càng nhiều lõi thì CPU càng có thể thực thi nhiều tiến trình đồng thời.

Ví dụ, một CPU dual-core có thể thực thi đúng hai tiến trình đồng thời và một CPU quad-core có thể thực thi tối đa bốn tiến trình đồng thời.

Xử lý đa tiến trình sử dụng CPU đa lõi trong một máy tính duy nhất, thực sự thực thi nhiều tiến trình song song.

Nhiệm vụ ràng buộc CPU và ràng buộc I/O

Nói chung, các chương trình xử lý hai loại nhiệm vụ: ràng buộc I/O hoặc ràng buộc CPU.

  • Nhiệm vụ ràng buộc I/O (I/O-bound tasks) dành nhiều thời gian hơn để thực hiện I/O so với tính toán. Các ví dụ điển hình của nhiệm vụ ràng buộc I/O là yêu cầu mạng, kết nối cơ sở dữ liệu và đọc/ghi file.
  • Ngược lại, nhiệm vụ ràng buộc CPU (CPU-bound tasks) sử dụng nhiều thời gian hơn để tính toán so với việc tạo yêu cầu I/O. Các ví dụ điển hình của nhiệm vụ ràng buộc CPU là nhân ma trận, tìm số nguyên tố, nén video và truyền video.

Về mặt kỹ thuật, xử lý đa luồng phù hợp với nhiệm vụ ràng buộc I/O, và xử lý đa tiến trình phù hợp với nhiệm vụ ràng buộc CPU.

Bảng sau minh họa sự khác biệt chính giữa một tiến trình và một luồng:

Tiêu chí

Processes

Threads

Chia sẻ bộ nhớ Bộ nhớ không được chia sẻ giữa các tiến trình Bộ nhớ được chia sẻ giữa các luồng trong một tiến trình
Kích thước bộ nhớ Lớn Nhỏ
Xử lý ràng buộc CPU và I/O Tối ưu hóa cho nhiệm vụ ràng buộc CPU Tối ưu hóa cho nhiệm vụ ràng buộc I/O
Thời gian khởi tạo Chậm hơn so với luồng Nhanh hơn so với tiến trình
Khả năng gián đoạn Các tiến trình con có thể bị gián đoạn

Các luồng không thể bị gián đoạn

Kết bài

Qua hướng dẫn này, mình đã tìm hiểu rõ ràng về các tiến trình (process) và luồng (thread), cũng như những khác biệt quan trọng giữa chúng. Việc hiểu và áp dụng đúng đắn các khái niệm này không chỉ giúp tối ưu hóa hiệu suất của ứng dụng mà còn nâng cao khả năng quản lý và sử dụng tài nguyên hệ thống một cách hiệu quả. Dù bạn đang làm việc với các tác vụ yêu cầu nhiều tính toán hay các tác vụ liên quan đến I/O, việc lựa chọn giữa đa tiến trình và đa luồng sẽ đóng vai trò then chốt trong việc đạt được hiệu quả cao nhất. Hy vọng qua bài viết này, bạn đã có được cái nhìn rõ ràng và sâu sắc hơn về Processes and Threads, và có thể áp dụng chúng một cách hiệu quả trong các dự

Cùng chuyên mục:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top