Khóa học python

Vòng đời của Thread trong Python

0 phút đọc

Trong lập trình đa luồng (multithreading), một thread (luồng) là một đơn vị thực thi nhỏ nhất trong một chương trình. Hiểu rõ vòng đời của thread là rất quan trọng để quản lý và tối ưu hóa hiệu suất của ứng dụng. Bài viết này sẽ hướng dẫn chi tiết về vòng đời của thread trong Python, kèm theo các ví dụ minh họa cụ thể.

Vòng đời của Thread trong Python

Vòng đời của một thread trong Python bao gồm các trạng thái sau:

New (Mới): Thread được tạo ra nhưng chưa bắt đầu chạy.
Runnable (Có thể chạy): Thread đã sẵn sàng để chạy và đang chờ được lên lịch.
Running (Đang chạy): Thread đang thực thi.
Blocked (Bị chặn): Thread đang chờ một tài nguyên hoặc điều kiện để tiếp tục chạy.
Terminated (Kết thúc): Thread đã hoàn thành thực thi hoặc bị dừng lại.

Trạng thái New

Thread ở trạng thái New khi nó được tạo ra nhưng chưa bắt đầu chạy. Điều này xảy ra khi bạn tạo một đối tượng thread nhưng chưa gọi phương thức start().

import threading

def thread_function():
    print("Thread is running")

# Tạo một thread nhưng chưa bắt đầu chạy
thread = threading.Thread(target=thread_function)
print("Thread is in New state")

Trạng thái Runnable

Thread chuyển sang trạng thái Runnable khi phương thức start() được gọi. Thread đã sẵn sàng để chạy và đang chờ được lên lịch.

import threading

def thread_function():
    print("Thread is running")

# Tạo và bắt đầu một thread
thread = threading.Thread(target=thread_function)
thread.start()
print("Thread is in Runnable state")

Trạng thái Running

Thread chuyển sang trạng thái Running khi nó được lên lịch và bắt đầu thực thi. Trong trạng thái này, thread thực hiện các tác vụ được định nghĩa trong phương thức run().

import threading
import time

def thread_function():
    print("Thread is running")
    time.sleep(
    print("Thread has finished running")

# Tạo và bắt đầu một thread
thread = threading.Thread(target=thread_function)
thread.start()
print("Thread is in Running state")

Trạng thái Blocked

Thread chuyển sang trạng thái Blocked khi nó đang chờ một tài nguyên hoặc điều kiện để tiếp tục chạy. Điều này có thể xảy ra khi thread đang chờ khóa (lock), điều kiện (condition), hoặc đang ngủ (sleep).

import threading
import time

def thread_function(lock):
    with lock:
        print("Thread has acquired the lock")
        time.sleep(
        print("Thread is releasing the lock")

# Tạo một khóa
lock = threading.Lock()

# Tạo và bắt đầu một thread
thread = threading.Thread(target=thread_function, args=(lock,))
thread.start()

# Chờ một chút để đảm bảo thread đã bắt đầu và đang chờ khóa
time.sleep(
print("Thread is in Blocked state")

Trạng thái Terminated

Thread chuyển sang trạng thái Terminated khi nó hoàn thành thực thi hoặc bị dừng lại. Trong trạng thái này, thread không còn chạy nữa.

import threading
import time

def thread_function():
    print("Thread is running")
    time.sleep(
    print("Thread has finished running")

# Tạo và bắt đầu một thread
thread = threading.Thread(target=thread_function)
thread.start()

# Chờ thread hoàn thành
thread.join()
print("Thread is in Terminated state")

Ví dụ về Vòng đời của Thread trong Python

Ví dụ về Thread đơn giản

Dưới đây là một ví dụ đơn giản về việc tạo và chạy một thread trong Python.

import threading
import time

def print_numbers():
    for i in range(:
        print(i)
        time.sleep(

# Tạo và bắt đầu một thread
thread = threading.Thread(target=print_numbers)
thread.start()

# Chờ thread hoàn thành
thread.join()
print("Thread has finished execution")

Output:

0
1
2
3
4
Thread has finished execution

Ví dụ về Thread với Khóa (Lock)

Dưới đây là một ví dụ về việc sử dụng khóa (lock) để đồng bộ hóa các thread.

import threading
import time

def print_numbers(lock):
    with lock:
        for i in range(:
            print(i)
            time.sleep(

# Tạo một khóa
lock = threading.Lock()

# Tạo và bắt đầu hai thread
thread= threading.Thread(target=print_numbers, args=(lock,))
thread= threading.Thread(target=print_numbers, args=(lock,))

threadstart()
threadstart()

# Chờ các thread hoàn thành
threadjoin()
threadjoin()
print("Both threads have finished execution")

Output:

0
1
2
3
4
0
1
2
3
4
Both threads have finished execution

Ví dụ về Thread với Điều kiện (Condition)

Dưới đây là một ví dụ về việc sử dụng điều kiện (condition) để đồng bộ hóa các thread.

import threading
import time

def consumer(condition):
    with condition:
        print("Consumer is waiting")
        condition.wait()
        print("Consumer has consumed the item")

def producer(condition):
    with condition:
        print("Producer is producing an item")
        time.sleep(
        print("Producer has produced an item")
        condition.notify()

# Tạo một điều kiện
condition = threading.Condition()

# Tạo và bắt đầu các thread
consumer_thread = threading.Thread(target=consumer, args=(condition,))
producer_thread = threading.Thread(target=producer, args=(condition,))

consumer_thread.start()
producer_thread.start()

# Chờ các thread hoàn thành
consumer_thread.join()
producer_thread.join()
print("Both threads have finished execution")

Output:

Consumer is waiting
Producer is producing an item
Producer has produced an item
Consumer has consumed the item
Both threads have finished execution

Các Thực Hành Tốt Nhất khi Sử Dụng Thread

Sử dụng Khóa (Lock) để Đồng Bộ Hóa

Sử dụng khóa (lock) để đồng bộ hóa các thread và tránh các vấn đề liên quan đến truy cập đồng thời vào tài nguyên chia sẻ.

import threading

lock = threading.Lock()

def thread_function():
    with lock:
        # Thực hiện các tác vụ cần đồng bộ hóa
        pass

Sử dụng Điều Kiện (Condition) để Đồng Bộ Hóa

Sử dụng điều kiện (condition) để đồng bộ hóa các thread và quản lý việc chờ đợi và thông báo giữa các thread.

import threading

condition = threading.Condition()

def consumer():
    with condition:
        condition.wait()
        # Thực hiện các tác vụ sau khi nhận được thông báo
        pass

def producer():
    with condition:
        # Thực hiện các tác vụ trước khi thông báo
        condition.notify()

Tránh Sử Dụng Biến Toàn Cục

Tránh sử dụng biến toàn cục để lưu trữ trạng thái của thread. Thay vào đó, sử dụng các đối tượng thread-safe hoặc truyền tham số vào các thread.

import threading

class ThreadSafeCounter:
    def __init__(self):
        self.value = 0
        self.lock = threading.Lock()

    def increment(self):
        with self.lock:
            self.value += 1

counter = ThreadSafeCounter()

def thread_function():
    for _ in range(00):
        counter.increment()

Kết luận

Vòng đời của thread trong Python bao gồm các trạng thái New, Runnable, Running, Blocked, và Terminated. Hiểu rõ các trạng thái này giúp bạn quản lý và tối ưu hóa hiệu suất của ứng dụng đa luồng. Bằng cách sử dụng các cơ chế đồng bộ hóa như khóa (lock) và điều kiện (condition), bạn có thể đảm bảo rằng các thread hoạt động một cách an toàn và hiệu quả. Hy vọng rằng các ví dụ và hướng dẫn trong bài viết này sẽ giúp bạn hiểu rõ hơn về vòng đời của thread trong Python và áp dụng chúng vào các dự án lập trình của mình.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Có thể đổi tên cơ sở dữ liệu không? Nếu có, bạn sẽ đổi tên cơ sở dữ liệu như thế nào?

entry

Nêu một số đặc điểm của Python?

entry

Liệt kê một số ứng dụng thực tế của Hàng đợi (Queue)?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely