Lập trình đa luồng (multithreading) cho phép thực hiện nhiều luồng (thread) đồng thời trong một ứng dụng. Mỗi luồng có thể chạy các tác vụ khác nhau, giúp tận dụng tốt hơn tài nguyên hệ thống.
threading
Python đã tích hợp sẵn thư viện threading
, do đó bạn chỉ cần import để sử dụng:
import threading
threading
Để tạo một luồng, bạn chỉ cần khởi tạo một đối tượng Thread
và cung cấp hàm sẽ thực thi:
import threading import time def print_numbers(): for i in range(5): time.sleep(1) print(i) # Tạo luồng thread = threading.Thread(target=print_numbers) # Khởi chạy luồng thread.start() # Chờ luồng hoàn thành thread.join() print("Luồng đã hoàn thành!")
Sử dụng phương thức join()
để chờ luồng hoàn thành trước khi tiếp tục thực hiện các lệnh khác.
Để chạy nhiều luồng, bạn có thể tạo nhiều đối tượng Thread
và khởi chạy chúng như sau:
def print_even_numbers(): for i in range(0, 10, 2): time.sleep(1) print(i) def print_odd_numbers(): for i in range(1, 10, 2): time.sleep(1) print(i) # Tạo luồng even_thread = threading.Thread(target=print_even_numbers) odd_thread = threading.Thread(target=print_odd_numbers) # Khởi chạy luồng even_thread.start() odd_thread.start() # Chờ cả hai luồng hoàn thành even_thread.join() odd_thread.join() print("Cả hai luồng đã hoàn thành!")
Khi nhiều luồng truy cập vào cùng một tài nguyên, có thể xảy ra tình trạng đua, dẫn đến kết quả không chính xác.
Lock
để đồng bộ hóaSử dụng Lock
để đảm bảo rằng chỉ một luồng có thể truy cập vào tài nguyên tại một thời điểm.
lock = threading.Lock() counter = 0 def increment(): global counter for _ in range(100000): lock.acquire() counter += 1 lock.release() # Tạo các luồng threads = [threading.Thread(target=increment) for _ in range(2)] # Khởi chạy các luồng for thread in threads: thread.start() # Chờ các luồng hoàn thành for thread in threads: thread.join() print(f"Giá trị cuối cùng của counter: {counter}")
ThreadPoolExecutor
ThreadPoolExecutor
ThreadPoolExecutor
cho phép quản lý nhóm các luồng, giúp tối ưu hóa việc sử dụng tài nguyên và đơn giản hóa quá trình quản lý luồng.
ThreadPoolExecutor
Dưới đây là cách sử dụng ThreadPoolExecutor
để thực hiện các tác vụ đồng thời:
from concurrent.futures import ThreadPoolExecutor import time def task(n): time.sleep(1) return n * n # Sử dụng ThreadPoolExecutor with ThreadPoolExecutor(max_workers=5) as executor: results = list(executor.map(task, range(10))) print("Kết quả:", results)
Lập trình đa luồng trong Python cho phép thực hiện nhiều tác vụ đồng thời, cải thiện hiệu suất và trải nghiệm người dùng. Thư viện threading
cung cấp các công cụ cần thiết để tạo và quản lý các luồng, cũng như các cơ chế đồng bộ hóa để tránh tình trạng đua.
Để phát triển kỹ năng lập trình đa luồng, hãy thực hành với các dự án thực tế và tìm hiểu thêm về các chủ đề nâng cao như lập trình bất đồng bộ (asynchronous programming) và các mô hình đồng bộ hóa phức tạp hơn.