PHP
Python

Trang chủ

Daemon Threads là gì? Hướng dẫn cách thiết lập Daemon Threads trong Python

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

Daemon Threads là gì? Hướng dẫn cách thiết lập Daemon Threads trong Python

Daemon thread là một loại luồng chạy nền trong Python, thực hiện các tác vụ phụ không ảnh hưởng đến tiến trình chính. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách sử dụng daemon thread, sự khác biệt giữa daemon thread và non-daemon thread, cũng như cách quản lý thuộc tính của chúng. Bạn cũng sẽ biết cách tạo và kiểm soát daemon thread trong Python một cách hiệu quả.

Điểm chính cần nắm

  • Daemon thread trong Python là gì?: Giải thích về daemon thread trong Python là loại thread chạy nền và tự động kết thúc khi chương trình chính kết thúc.
  • So sánh daemon thread và non-daemon thread trong Python: So sánh các đặc điểm và sự khác nhau giữa daemon thread và non-daemon thread trong Python.
  • Cách tạo daemon thread trong Python: Hướng dẫn tạo daemon thread thông qua hai cách: đặt daemon=True khi khởi tạo và gán daemon=True sau khi tạo nhưng trước khi gọi start().
  • Cách 1: Đặt daemon=True khi tạo thread: Mô tả cách tạo daemon thread bằng cách truyền daemon=True khi khởi tạo đối tượng Thread.
  • Cách 2: Gán daemon=True sau khi tạo nhưng trước khi start(): Hướng dẫn cách thay đổi thuộc tính daemon của thread sau khi tạo nhưng trước khi gọi start().
  • Quản lý thuộc tính của daemon thread trong Python: Các quy tắc khi thay đổi thuộc tính daemon và điều kiện sử dụng.
  • FAQ: Những câu hỏi thường gặp về daemon thread, bao gồm cách kiểm tra, thay đổi và ứng dụng của nó.
  • Vietnix – Nhà cung cấp dịch vụ lưu trữ hàng đầu, đảm bảo tốc độ và bảo mật vượt trội: Giới thiệu về Vietnix, một nhà cung cấp dịch vụ lưu trữ với cam kết bảo mật và hiệu suất tốt.

Daemon thread trong Python là gì?

Daemon thread trong Python là một loại thread chạy nền, không ảnh hưởng đến tiến trình chính và sẽ tự động kết thúc khi chương trình chính dừng, ngay cả khi nó chưa hoàn thành công việc. Chúng thường được sử dụng cho các tác vụ không quan trọng như ghi log, lưu dữ liệu tự động hoặc web scraping. Python mặc định tạo thread dưới dạng non-daemon, nhưng có thể chuyển thành daemon bằng cách đặt thuộc tính daemon=True.

Daemon thread trong Python
Daemon thread trong Python

So sánh daemon thread và non-daemon thread trong Python

Dưới đây là bảng so sánh giữa daemon threadnon-daemon thread trong Python:

Tiêu chíDaemon ThreadNon-Daemon Thread
Mục đíchChạy nền, xử lý các tác vụ không quan trọng như logging, auto-save, web scraping.Xử lý các tác vụ quan trọng, ảnh hưởng đến luồng chính.
Kết thúcBị dừng ngay khi chương trình chính kết thúc, không quan tâm còn chạy hay không.Tiếp tục chạy cho đến khi hoàn thành, ngay cả khi chương trình chính đã kết thúc.
Mặc địnhKhông phải mặc định, phải đặt daemon=True.Mặc định khi tạo thread.
Thay đổi trạng thái daemonCó thể đặt daemon=True trước khi start(). Không thể thay đổi sau khi thread đã chạy.Không cần thay đổi trạng thái vì mặc định là non-daemon.
Độ ưu tiênThấp, chỉ chạy khi còn tài nguyên rảnh.Cao, được ưu tiên hoàn thành.
So sánh daemon thread và non-daemon thread

Ví dụ tạo daemon thread:

import threading

def run():
    print("Daemon thread is running...")

thread = threading.Thread(target=run, daemon=True)  # Đặt daemon=True
thread.start()

Ví dụ tạo non-daemon thread (mặc định):

thread = threading.Thread(target=run)  # Mặc định là non-daemon
thread.start()

Tóm lại:

  • Daemon thread thích hợp cho tác vụ nền, không ảnh hưởng đến chương trình chính.
  • Non-daemon thread dùng cho tác vụ quan trọng, cần đảm bảo hoàn thành trước khi chương trình kết thúc.

Cách tạo daemon thread trong Python

Để tạo một daemon thread trong Python, bạn có thể sử dụng hai cách đơn giản. Một là đặt thuộc tính daemon=True khi khởi tạo thread, và cách khác là gán thuộc tính này sau khi tạo thread nhưng trước khi gọi phương thức start(). Cả hai cách này đều giúp bạn tạo ra các thread chạy nền, tự động kết thúc khi chương trình chính kết thúc mà không cần phải lo lắng về việc theo dõi chúng.

Cách 1: Đặt daemon=True khi tạo thread

Để tạo một daemon thread, em có thể đặt daemon=True ngay khi khởi tạo đối tượng Thread. Điều này giúp thread chạy nền mà không làm gián đoạn chương trình chính.

Ví dụ: Hãy xem ví dụ sau để tạo một luồng daemon và kiểm tra xem luồng có phải daemon hay không bằng cách sử dụng thuộc tính daemon.

import threading
from time import sleep

def run():
    thread = threading.current_thread()
    print(f"Daemon thread: {thread.daemon}")

# Tạo thread và đặt daemon=True ngay từ đầu
thread = threading.Thread(target=run, daemon=True)
thread.start()

print("Is Main Thread a Daemon thread:", threading.current_thread().daemon)

# Chờ một chút để daemon thread có thời gian chạy
sleep(0.5)

Lưu ý:

  • Khi khởi tạo thread bằng cách đặt daemon=True, thread sẽ ngay lập tức trở thành daemon thread.
  • Cách khác để tạo daemon thread: pythonCopyEditt1 = threading.Thread(daemon=True) Khi đó, thread t1 sẽ được thiết lập là daemon ngay từ khi tạo.

Kết quả:

Daemon thread: True
Is Main Thread a Daemon thread: False

iconLưu ý

  • Nếu không đặt daemon=True, thread sẽ mặc định là non-daemon.
  • Không thể thay đổi daemon sau khi thread đã start(), nếu cố gắng thay đổi sẽ gây lỗi RuntimeError.

Cách 2: Gán daemon=True sau khi tạo nhưng trước khi start()

Ngoài cách đặt daemon=True khi khởi tạo thread, bạn cũng có thể gán thuộc tính daemon=True cho thread sau khi tạo nhưng phải làm điều này trước khi gọi phương thức start().

  • Khi một đối tượng thread được tạo mà không có tham số nào, thread sẽ là non-daemon (mặc định) vì luồng chính không phải là daemon. Do đó, các luồng được tạo trong luồng chính sẽ mặc định là non-daemon.
  • Tuy nhiên, bạn có thể thay đổi thuộc tính daemon thành True bằng cách sử dụng Thread.daemon trước khi bắt đầu thread, nghĩa là trước khi gọi start().

Ví dụ:

import threading 
from time import sleep

def run():
    thread = threading.current_thread()
    print(f"Daemon thread: {thread.daemon}")

# Tạo thread mà không đặt daemon ngay từ đầu
thread = threading.Thread(target=run)

# Gán daemon=True trước khi start()
thread.daemon = True

# Khởi chạy thread
thread.start()

print("Is Main Thread a Daemon thread:", threading.current_thread().daemon)

# Đợi một chút để thread daemon có thời gian chạy
sleep(0.5)

Kết quả:

Daemon thread: True
Is Main Thread a Daemon thread: False

iconLưu ý

  • Không thể thay đổi thuộc tính daemon sau khi thread đã được khởi chạy (sau khi gọi start()). Nếu cố gắng thay đổi, sẽ gặp lỗi RuntimeError.

Quản lý thuộc tính của daemon thread trong Python

Trong Python, thuộc tính daemon của một thread xác định xem thread đó có phải là daemon thread hay không. Tuy nhiên, có một số điều cần lưu ý khi quản lý thuộc tính này:

  • Gán daemon=True trước khi gọi start(): Khi tạo thread, em có thể gán thuộc tính daemon=True để thread trở thành daemon thread. Điều quan trọng là phải gán giá trị cho thuộc tính daemon trước khi gọi phương thức start(). Sau khi gọi start(), không thể thay đổi thuộc tính này nữa.
  • Không thể thay đổi daemon sau khi gọi start(): Nếu em cố gắng thay đổi thuộc tính daemon sau khi thread đã bắt đầu chạy (sau khi gọi start()), Python sẽ gây ra một lỗi RuntimeError. Nếu em cố gắng đặt trạng thái daemon của một luồng sau khi đã bắt đầu nó, sẽ xảy ra lỗi này.

Ví dụ: Dưới đây là một ví dụ minh họa cho việc nhận được RuntimeError khi cố gắng thay đổi trạng thái daemon của một thread sau khi đã bắt đầu nó.

from time import sleep
from threading import current_thread
from threading import Thread

# Hàm sẽ được thực thi trong một thread mới
def run():
    # Lấy thông tin của thread hiện tại
    thread = current_thread()
    # Kiểm tra xem thread có phải là daemon thread không?
    print(f'Daemon thread: {thread.daemon}')
    # Thử thay đổi thuộc tính daemon sau khi thread đã được start
    thread.daemon = True  # Điều này sẽ gây lỗi RuntimeError

# Tạo một thread mới
thread = Thread(target=run)

# Khởi chạy thread
thread.start()

# Tạm dừng chương trình trong 0.5 giây để daemon thread có thể chạy
sleep(0.5)

Kết quả:

Daemon thread: False
Exception in thread Thread-1 (run):
Traceback (most recent call last):
File “/usr/lib/python3.10/threading.py”, line 1203, in daemon
raise RuntimeError(“cannot set daemon status of active thread”)
RuntimeError: cannot set daemon status of active thread

Ghi chú:

  • Vấn đề: Trong đoạn code trên, bạn gán thread.daemon = True sau khi thread đã được bắt đầu bằng phương thức start(). Điều này gây ra lỗi RuntimeError vì thuộc tính daemon không thể thay đổi sau khi thread đã chạy.
  • Cách khắc phục: Nếu muốn thay đổi thuộc tính daemon, bạn cần gán nó trước khi gọi start().

Vietnix – Nhà cung cấp dịch vụ lưu trữ hàng đầu, đảm bảo tốc độ và bảo mật vượt trội

Vietnix tự hào là một trong những nhà cung cấp dịch vụ cho thuê máy chủ (server), hosting, VPSdomain uy tín hàng đầu tại Việt Nam. Với sứ mệnh mang lại các giải pháp lưu trữ hiệu quả và bảo mật tối ưu, Vietnix cam kết cung cấp dịch vụ chất lượng cao, đi kèm với đội ngũ hỗ trợ kỹ thuật chuyên nghiệp, luôn sẵn sàng 24/7. Hơn 80.000 khách hàng đã tin tưởng lựa chọn Vietnix, nhờ vào dịch vụ cho thuê máy chủ đáng tin cậy, giúp tối ưu hóa hiệu suất và bảo mật dữ liệu cho các doanh nghiệp.

Thông tin liên hệ:

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

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

Có thể thay đổi thuộc tính daemon của một thread sau khi đã gọi start() không?

Không, bạn không thể thay đổi thuộc tính daemon của một thread sau khi đã gọi start(). Nếu cố gắng làm như vậy, Python sẽ ném ra lỗi RuntimeError.

Daemon thread khác gì so với non-daemon thread?

Sự khác biệt chính giữa daemon thread và non-daemon thread là: Daemon thread sẽ tự động kết thúc khi chương trình chính kết thúc, trong khi non-daemon thread sẽ tiếp tục chạy cho đến khi hoàn thành, dù chương trình chính có kết thúc hay không.

Có thể kiểm tra xem một thread có phải là daemon thread không?

Có, bạn có thể kiểm tra thuộc tính daemon của đối tượng thread để xác định xem thread đó có phải là daemon thread hay không.

Có thể thay đổi trạng thái daemon của thread sau khi đã bắt đầu không?

Không, sau khi gọi phương thức start(), bạn không thể thay đổi trạng thái daemon của thread. Thay đổi này phải được thực hiện trước khi bắt đầu thread.

Lời kết

Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về daemon thread trong Python, cũng như cách tạo và quản lý chúng trong các ứng dụng thực tế. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới, mình sẽ hỗ trợ bạn nhanh nhất. Cảm ơn bạn đã đọc!

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