Lập trình đa luồng (multithreading) phần một

Thread là một đơn vị cơ bản trong CPU. Một luồng sẽ chia sẻ với các luồng khác trong cùng process về thông tin data, các dữ liệu của mình.

Trong nhiều trường hợp nhất định, một ứng dụng có thể được yêu cầu thực hiện (request) nhiều nhiệm vụ giống nhau. Ví dụ: một web server nhận lệnh từ khách hàng nhấn vào trang web, hình ảnh, âm thanh… và tất nhiên, một web server có thể phải nhận rất nhiều (hàng nghìn, hàng triệu cho đến hàng trăm triệu) yêu cầu cùng một lúc. Vì thế, nếu web server đó chạy theo dạng single-threaded, tức là chỉ một khách hàng được giải quyết yêu cầu trong 1 khoảng thời gian, thì những khách hàng khác sẽ phải đợi rất lâu để mình có thể access vào trang web.

Multithreading là khả năng xử lý nhiều thread cùng lúc của CPU. Khi có nhiều task khác nhau, CPU có thể làm việc với chúng đồng thời - concurrent hoặc song song - parallel.

Trong một đơn vị thời gian (nanosecond), chỉ có một chương trình (process) được chạy. Trong chương trình đó, lại chia ra thành nhiều luồn (thread) con, thực thi cùng một lúc (multithread, ít nhất là trong thời điểm hiện tại), tạo cho người dùng cảm giác chương trình đang chạy nhanh hơn. 

Thread cũng rất quan trọng đối với hệ thống RPC (Remote Procedure Call – hệ thống cho phép quá trình truyền tin giữa các tiến trình IPC – interprocess communication được diễn ra). Và hiển nhiên, RPC servers cũng là một dạng multithreaded. Khi một server PRC nhận được một tin nhắn, nó sẽ tạo ra một thread để giải quyết tin nhắn đó. Multithreaded giúp RPC có thể giải quyết nhiều yêu cầu cùng một lúc.

Nhờ khả năng xử lí các task có thể coi như đồng thời (concurrency), chương trình có thể đáp ứng tốt với người dùng trong khi đang bận làm việc khác. Và đó là chính ý tưởng cơ bản của multithread.

Context switch (đôi khi được gọi là process switch hoặc task switch) là quá trình lưu trữ trạng thái của CPU hoặc của một thread để có thể tiếp tục thực thi sau đó. 

Yielding: Python cung cấp thread Module và threading Module để bạn có thể bắt đầu một thread mới cũng như một số tác vụ khác trong khi lập trình đa luồng. Mỗi một Thread đều có vòng đời chung là bắt đầu, chạy và kết thúc. Một Thread có thể bị ngắt (interrupt), hoặc tạm thời bị dừng (sleeping) trong khi các Thread khác đang chạy

Xử lý đồng thời - Concurrency - là việc nhiều task được xử lý cùng một lúc. Concurrency không chỉ là một khái niệm cho thiết bị có chip nhiều nhân. Trong những thiết bị đơn nhân, chúng ta vẫn có thể xử lý được đa luồng dựa vào cơ chế time-slicing để chuyển ngữ cảnh.



Module Threading: 

threading.activeCount(): Trả về số đối tượng thread mà là active.

threading.currentThread(): Trả về số đối tượng thread trong Thread control của Caller.

threading.enumerate(): Trả về một danh sách tất cả đối tượng thread mà hiện tại là active.


Một số phương thức trong Thread

run(): Là entry point cho một Thread.

start(): Bắt đầu một thread bởi gọi phương thức run().

join([time]): Đợi cho các thread kết thúc.

isAlive(): Kiểm tra xem một thread có đang thực thi hay không.

getName(): Trả về tên của một thread.

setName(): Thiết lập tên của một thread

Python cung cấp threading Module, mà bao gồm một kỹ thuật locking cho phép bạn đồng bộ hóa các Thread một cách dễ dàng. Một lock mới được tạo bởi gọi phương thức Lock().



Nhận xét

Bài đăng phổ biến từ blog này

Thương mại hoá y tế

Các IDE hỗ trợ lập trình viên Python

CÁCH XỬ LÝ FILE trong Python