Trong Python, threading là một kỹ thuật cho phép các hoạt động chạy đồng thời và độc lập với nhau trong một chương trình. Kỹ thuật này được sử dụng để tận dụng tối đa tài nguyên hệ thống, đồng thời tăng tốc độ thực thi của chương trình.
Mỗi thread được hiểu như một chương trình con độc lập, chạy trong một không gian địa chỉ bộ nhớ riêng và có thể thực hiện các hoạt động độc lập với các thread khác. Trong Python, chúng ta có thể sử dụng module threading
để tạo và quản lý các thread.
Một số ứng dụng của threading trong Python là xử lý đa luồng trong các ứng dụng web, xử lý các tác vụ chạy song song như tải file, gửi email, đọc dữ liệu từ cơ sở dữ liệu, v.v.
Để sử dụng module threading trong Python, trước tiên ta cần import module này bằng cú pháp:
import threading
Sau đó, ta có thể tạo một đối tượng thread bằng cách khởi tạo lớp Thread
trong module threading
như sau:
thread = threading.Thread(target=func, args=args)
Trong đó:
target
: là hàm mà thread sẽ thực thi.args
: là một tuple chứa các tham số truyền vào hàmtarget
.
Sau khi tạo được đối tượng thread, ta có thể bắt đầu thực thi thread bằng cách gọi phương thức start()
như sau:
thread.start()
Ngoài ra, ta còn có thể sử dụng các phương thức khác của đối tượng thread như join()
để đợi cho thread kết thúc, is_alive()
để kiểm tra xem thread đang chạy hay đã dừng, name
để lấy tên của thread, ident
để lấy id của thread, v.v.
Dưới đây là một ví dụ về threading trong Python:
Ví dụ 1:
import threading
def worker():
"""Hàm xử lý tác vụ trong thread"""
print("Starting worker thread...")
# Do some work here
print("Finishing worker thread...")
if __name__ == "__main__":
print("Starting main thread...")
# Tạo một thread mới
t = threading.Thread(target=worker)
# Bắt đầu thực thi thread
t.start()
print("Finishing main thread...")
Trong ví dụ này, chúng ta sử dụng module threading
để tạo một thread mới và thực thi nó. Khi chạy chương trình, trước tiên main thread sẽ được thực thi, sau đó một thread mới được tạo và bắt đầu thực thi. Cả hai thread đều hoạt động độc lập với nhau và có thể chạy song song, tùy thuộc vào tài nguyên hệ thống.
Ví dụ 2:
Đây là một ví dụ về sử dụng threading và wget để tải nhiều file cùng một lúc trên Linux:
import threading
import subprocess
def download_file(url):
subprocess.call(['wget', url])
if __name__ == '__main__':
urls = ['https://example.com/file1.zip', 'https://example.com/file2.zip', 'https://example.com/file3.zip']
threads = []
for url in urls:
thread = threading.Thread(target=download_file, args=(url,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
Trong ví dụ này, chúng ta định nghĩa một hàm download_file
sử dụng subprocess để gọi lệnh wget để tải về file từ địa chỉ url được truyền vào hàm.
Tiếp theo, chúng ta tạo một danh sách urls
chứa các URL tải về.
Sau đó, chúng ta tạo một danh sách threads
và khởi tạo mỗi luồng với target=download_file
và args=(url,)
để gọi hàm download_file
với đối số là url tương ứng.
Cuối cùng, chúng ta chờ cho tất cả các luồng kết thúc bằng cách sử dụng thread.join()
.
Khi chạy chương trình, nó sẽ tải xuống các file từ các URL cùng một lúc bằng cách sử dụng các luồng khác nhau, tăng tốc độ tải xuống.
Ví dụ 3.
Một ví dụ về sử dụng threading trong quản trị hệ thống Linux là khi bạn muốn thực hiện đồng thời nhiều tác vụ trong một chương trình Python. Ví dụ, bạn có thể sử dụng threading để thực hiện các tác vụ I/O đồng thời mà không ảnh hưởng đến hiệu suất của hệ thống.
Dưới đây là một ví dụ về sử dụng threading để tải nội dung của nhiều trang web cùng một lúc:
import threading
import requests
class WebsiteDownloader(threading.Thread):
def __init__(self, url):
threading.Thread.__init__(self)
self.url = url
def run(self):
response = requests.get(self.url)
content = response.content
print(f"Downloaded {len(content)} bytes from {self.url}")
urls = [
"https://www.google.com",
"https://www.yahoo.com",
"https://www.bing.com",
"https://www.wikipedia.org",
"https://www.amazon.com"
]
downloaders = []
for url in urls:
downloader = WebsiteDownloader(url)
downloader.start()
downloaders.append(downloader)
for downloader in downloaders:
downloader.join()
Trong ví dụ này, chúng ta định nghĩa một lớp con của lớp Thread
để tải nội dung từ một trang web. Mỗi đối tượng WebsiteDownloader
được tạo ra với một URL khác nhau. Sau đó, chúng ta khởi động mỗi đối tượng WebsiteDownloader
bằng cách gọi phương thức start()
của nó. Các đối tượng WebsiteDownloader
này chạy đồng thời trên các thread khác nhau, cho phép chúng ta tải nội dung của nhiều trang web cùng một lúc. Cuối cùng, chúng ta đợi tất cả các thread hoàn thành bằng cách gọi phương thức join()
của từng đối tượng WebsiteDownloader
.