Xử lý đa luồng trong Python
Hướng dẫn chi tiết cách xử lý đa luồng trong Python bằng cách sử dụng thư viện `threading` và `concurrent.futures`. Bài viết này giúp bạn hiểu cách sử dụng đa luồng để tăng hiệu suất xử lý đồng thời trong các tác vụ.
Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử lý đa luồng trong Python, giúp cải thiện hiệu suất cho các chương trình có tính chất xử lý đồng thời. Chúng ta sẽ sử dụng các thư viện threading
và concurrent.futures
để triển khai các ví dụ minh họa.
Mã Python
1. Sử dụng thư viện threading
import threading
import time
def print_numbers():
for i in range(1, 6):
print(f"Số: {i}")
time.sleep(1)
def print_letters():
for letter in ['A', 'B', 'C', 'D', 'E']:
print(f"Chữ cái: {letter}")
time.sleep(1)
# Tạo hai luồng
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
# Bắt đầu các luồng
thread1.start()
thread2.start()
# Đợi cho cả hai luồng hoàn thành
thread1.join()
thread2.join()
print("Hoàn tất xử lý đa luồng")
2. Sử dụng thư viện concurrent.futures
import concurrent.futures
import time
def process_task(task_name, duration):
print(f"Bắt đầu {task_name}")
time.sleep(duration)
return f"Hoàn thành {task_name}"
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
futures = [executor.submit(process_task, f"Task {i+1}", 2) for i in range(2)]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print("Hoàn tất xử lý đa luồng")
Giải thích chi tiết từng dòng code
Mã 1 - threading
:
threading.Thread(target=...)
: Tạo luồng mới thực hiện hàm được chỉ định.start()
: Bắt đầu thực thi luồng.join()
: Đợi luồng kết thúc trước khi tiếp tục thực hiện đoạn mã tiếp theo.
Mã 2 - concurrent.futures
:
ThreadPoolExecutor(max_workers=2)
: Tạo Thread Pool với 2 luồng.executor.submit(...)
: Gửi một công việc vào Thread Pool để xử lý.concurrent.futures.as_completed(futures)
: Lặp lại qua các công việc đã hoàn thành.
Yêu cầu hệ thống:
- Python 3.6 trở lên
Cách cài đặt các thư viện để chạy được đoạn mã Python trên:
Cả hai thư viện threading
và concurrent.futures
đều là các thư viện tiêu chuẩn, không cần cài đặt bổ sung.
Lời khuyên:
- Đa luồng hữu ích khi cần xử lý các tác vụ I/O, nhưng có thể không hiệu quả với các tác vụ CPU-bound do GIL (Global Interpreter Lock).
- Sử dụng
concurrent.futures
cho các tình huống đa luồng phức tạp để có được mã dễ đọc và bảo trì hơn.