PHP
Python

Trang chủ

Cách khởi chạy thread trong Python chi tiết

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
17/03/2025
12 phút đọc
Theo dõi Vietnix trên

Cách khởi chạy thread trong Python chi tiết

Thread trong Python cho phép chương trình thực thi nhiều tác vụ cùng lúc bằng cách chạy song song trên nhiều luồng. Điều này giúp tối ưu hiệu suất, đặc biệt khi xử lý các tác vụ I/O như đọc ghi file, gọi API hay xử lý dữ liệu lớn. Trong bài viết này, mình sẽ hướng dẫn cách khởi chạy thread trong Python chi tiết, kèm theo ví dụ minh họa dễ hiểu.

Những điểm chính

  • Khái niệm: Hiểu cách khởi chạy thread trong Python và vai trò của nó trong lập trình đa luồng.
  • Cách thực hiện: Biết cách sử dụng phương thức start() để khởi chạy thread, giúp chương trình chạy nhiều tác vụ đồng thời.
  • Ví dụ thực tế: Xem qua các ví dụ minh họa giúp hiểu rõ cách triển khai thread trong Python.
  • Biết thêm dịch vụ lưu trữ tốc độ cao từ Vietnix.
  • Giải đáp thắc mắc: Giải quyết các câu hỏi phổ biến liên quan đến thread trong Python.

Khởi chạy thread trong Python là gì?

Khởi chạy thread trong Python là quá trình sử dụng phương thức start() của lớp thread trong module threading để thực thi một tác vụ trong luồng riêng biệt. Khi gọi start(), Python sẽ tự động chạy phương thức run() của thread đó mà không làm gián đoạn luồng chính.

Khởi chạy thread trong Python là quá trình sử dụng phương thức start() của lớp thread trong module threading
Khởi chạy thread trong Python là quá trình sử dụng phương thức start() của lớp thread trong module threading

Điều này có nghĩa là khi bạn tạo nhiều thread (ví dụ: thread1, thread2, thread3) và gọi start() cho từng thread, chúng sẽ chạy song song, giúp chương trình xử lý nhiều tác vụ đồng thời. Trong khi các thread con thực thi, luồng chính của chương trình vẫn tiếp tục hoạt động mà không cần đợi từng thread hoàn thành.

Cách khởi chạy thread trong Python

Trong Python, phương thức start() là cách chính để bắt đầu thực thi một thread. Khi gọi start(), Python sẽ thiết lập môi trường cho thread và lên lịch chạy nó trong nền. Tuy nhiên, bạn cần lưu ý rằng mỗi đối tượng thread chỉ nên gọi start() một lần, nếu không sẽ phát sinh lỗi RuntimeError. Cú pháp sử dụng start(:

threading.Thread.start()

Ví dụ 1: Khởi chạy một thread trong Python

Dưới đây là một ví dụ đơn giản minh họa cách khởi chạy một thread bằng start():

from threading import Thread  
from time import sleep  
def backup_data(times):  
    for i in range(times):  
        print(f"Đang sao lưu dữ liệu... ({i+1})")  
        sleep(1)  
# Tạo thread mới để chạy tác vụ sao lưu dữ liệu  
thread = Thread(target=backup_data, args=(5,))  
thread.start()  
print("Quá trình sao lưu đang chạy trong nền...")  

Giải thích:

  • Hàm backup_data(times) thực hiện một công việc giả lập (sao lưu dữ liệu) lặp lại nhiều lần.
  • Sử dụng thread(target=backup_data, args=(5,)) để tạo một luồng chạy song song mà không làm gián đoạn chương trình chính.
  • Khi gọi thread.start(), chương trình chính tiếp tục chạy mà không phải đợi tác vụ sao lưu hoàn thành.
  • Kết quả như sau:

Quá trình sao lưu đang chạy trong nền…
Đang sao lưu dữ liệu… (1)
Đang sao lưu dữ liệu… (2)
Đang sao lưu dữ liệu… (3)
Đang sao lưu dữ liệu… (4)
Đang sao lưu dữ liệu… (5)

Ví dụ 2: Tạo và khởi chạy nhiều thread

Một ứng dụng thực tế khác của threading là chạy nhiều tác vụ song song. Ví dụ, khi quản lý nhiều máy chủ ảo (VPS), có thể cần kiểm tra tình trạng của chúng đồng thời thay vì tuần tự.

import threading  
import time  
class ServerCheck(threading.Thread):  
    def __init__(self, server_id, name, delay):  
        threading.Thread.__init__(self)  
        self.server_id = server_id  
        self.name = name  
        self.delay = delay  
    def run(self):  
        print(f"Bắt đầu kiểm tra {self.name}")  
        check_status(self.name, self.delay)  
        print(f"Hoàn thành kiểm tra {self.name}")  
def check_status(server_name, delay):  
    for _ in range(3):  
        time.sleep(delay)  
        print(f"{server_name}: Đang kiểm tra trạng thái...")  
# Tạo các thread để kiểm tra nhiều máy chủ cùng lúc  
server1 = ServerCheck(1, "VPS-1", 1)  
server2 = ServerCheck(2, "VPS-2", 2)  
server3 = ServerCheck(3, "VPS-3", 3)  
# Bắt đầu kiểm tra  
server1.start()  
server3.start()  
print("Quay lại luồng chính...")  

Giải thích:

  • Lớp ServerCheck kế thừa Thread và thực hiện kiểm tra trạng thái máy chủ.
  • Khi gọi server1.start()server3.start(), hai tác vụ này chạy đồng thời mà không cần đợi nhau.
  • server2.start() không được gọi, nên nó sẽ không chạy.
  • Kết quả như sau:

Bắt đầu kiểm tra VPS-1
Bắt đầu kiểm tra VPS-3
Quay lại luồng chính…
VPS-1: Đang kiểm tra trạng thái…
VPS-3: Đang kiểm tra trạng thái…
Hoàn thành kiểm tra VPS-1
VPS-3: Đang kiểm tra trạng thái…
VPS-3: Đang kiểm tra trạng thái…
Hoàn thành kiểm tra VPS-3

Vietnix – Nhà cung cấp dịch vụ lưu trữ tốc độ cao

Vietnix tự hào là một trong những đơn vị hàng đầu tại Việt Nam trong lĩnh vực web hostingVPSthuê máy chủ và domain, mang đến giải pháp lưu trữ với tốc độ vượt trội, bảo mật cao và hoạt động ổn định. Sở hữu hạ tầng mạnh mẽ cùng đội ngũ kỹ thuật hỗ trợ 24/7, Vietnix cam kết giúp website của bạn vận hành mượt mà, đảm bảo trải nghiệm tốt nhất cho người dùng. Hơn 80.000 khách hàng đã tin tưởng lựa chọn dịch vụ tại Vietnix để tối ưu hiệu suất website và bảo vệ dữ liệu quan trọng. Liên hệ ngay để được tư vấn giải pháp hosting phù hợp!

Thông tin liên hệ:

  • Hotline: 18001093
  • Email: sales@vietnix.com.vn 
  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Website: https://vietnix.vn/

Câu hỏi thường gặp

Làm sao để xử lý exception bên trong một thread mà không làm crash toàn bộ chương trình?

Để xử lý exception bên trong một thread mà không làm crash toàn bộ chương trình, cần sử dụng khối try-except trong phương thức run() hoặc hàm mà thread thực thi. Cách thực hiện:
Bọc code trong try-except: Giúp bắt lỗi và xử lý thay vì để thread dừng đột ngột.
Ghi log lỗi: Lưu thông tin lỗi để dễ debug mà không ảnh hưởng đến các thread khác.
Thông báo lỗi đến main thread: Nếu cần, có thể dùng queue hoặc biến chung để báo lỗi.

Điều gì sẽ xảy ra nếu một thread được tạo ra nhưng không bao giờ được start()?

Nếu một thread được tạo ra nhưng không bao giờ gọi start(), nó sẽ không bao giờ chạy. Thread đó sẽ tồn tại dưới dạng một đối tượng trong bộ nhớ nhưng không được hệ điều hành lên lịch thực thi. Hệ quả của việc không start() thread:
Không có tác vụ nào được thực thi: Code trong phương thức run() của thread sẽ không được thực hiện.
Chiếm bộ nhớ nhưng không hoạt động: Thread vẫn tồn tại trong bộ nhớ đến khi bị thu gom rác.
Không gây lỗi, nhưng vô ích: Chương trình vẫn chạy bình thường mà không có ảnh hưởng gì từ thread chưa khởi chạy.

Có thể hủy một thread ngay lập tức mà không cần đợi nó hoàn thành công việc không?

Không thể hủy một thread ngay lập tức trong Python theo cách an toàn mà không cần đợi nó hoàn thành công việc. Điều này là do Python không cung cấp phương thức chính thức nào để dừng một thread cưỡng bức. Lý do không thể hủy ngay lập tức một thread:
Gây lỗi không mong muốn: Cưỡng bức dừng một thread có thể khiến chương trình gặp lỗi, làm hỏng dữ liệu hoặc gây deadlock.
Không có API chính thức: Python không có phương thức như thread.terminate() để dừng một thread đang chạy.
GIL (Global Interpreter Lock): Python quản lý luồng bằng GIL, nên việc dừng thread không kiểm soát có thể gây mất ổn định chương trình.
Giải pháp thay thế:
Sử dụng cờ (flag) để kiểm soát luồng: Thread kiểm tra giá trị của cờ trong quá trình thực thi và tự dừng khi cần.
Dùng daemon thread: Khi chương trình chính kết thúc, tất cả daemon thread sẽ tự động bị hủy.

Tại sao khi gọi start() nhiều lần trên cùng một thread lại gây ra lỗi?

Khi gọi start() nhiều lần trên cùng một thread, Python sẽ ném lỗi RuntimeError vì một thread chỉ có thể khởi chạy một lần duy nhất. Nguyên nhân chính là:
Trạng thái thread không thể reset: Sau khi hoàn thành, thread chuyển sang trạng thái “terminated” và không thể khởi động lại.
Hệ điều hành quản lý thread: Một thread đã kết thúc không thể được hệ điều hành tái sử dụng.
Tránh lỗi không xác định: Nếu start() được gọi nhiều lần, có thể gây ra vấn đề về đồng bộ hóa và truy cập tài nguyên.
Cách khắc phục: Nếu cần chạy lại logic, hãy tạo một thread mới thay vì gọi lại start().

Lời kết

Việc khởi chạy thread trong Python giúp chương trình xử lý nhiều tác vụ đồng thời, tối ưu hiệu suất và giảm thời gian chờ. Bằng cách sử dụng phương thức start(), bạn có thể kích hoạt thread một cách đúng đắn và tránh các lỗi thường gặp. Hy vọng bài viết đã giúp bạn hiểu rõ cách khởi chạy và quản lý thread hiệu quả. Nếu bạn có bất kỳ thắc mắc nào, hãy để lại bình luận ngay bên dưới, mình sẽ giải đáp nhanh nhất. Cảm ơn bạn đã theo dõi bài viết!

Mọi người cũng xem:

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn