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ándaemon=True
sau khi tạo nhưng trước khi gọistart()
. - 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ượngThread
. - 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ọistart()
. - 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
.

So sánh daemon thread và non-daemon thread trong Python
Dưới đây là bảng so sánh giữa daemon thread và non-daemon thread trong Python:
Tiêu chí | Daemon Thread | Non-Daemon Thread |
---|---|---|
Mục đích | Chạ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úc | Bị 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 định | Không phải mặc định, phải đặt daemon=True . | Mặc định khi tạo thread. |
Thay đổi trạng thái daemon | Có 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ên | Thấp, chỉ chạy khi còn tài nguyên rảnh. | Cao, được ưu tiên hoàn thành. |
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: pythonCopyEdit
t1 = threading.Thread(daemon=True)
Khi đó, threadt1
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
Lư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ỗiRuntimeError
.
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ànhTrue
bằng cách sử dụngThread.daemon
trước khi bắt đầu thread, nghĩa là trước khi gọistart()
.
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
Lưu ý
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ọistart()
: Khi tạo thread, em có thể gán thuộc tínhdaemon=True
để thread trở thành daemon thread. Điều quan trọng là phải gán giá trị cho thuộc tínhdaemon
trước khi gọi phương thứcstart()
. Sau khi gọistart()
, không thể thay đổi thuộc tính này nữa. - Không thể thay đổi
daemon
sau khi gọistart()
: Nếu em cố gắng thay đổi thuộc tínhdaemon
sau khi thread đã bắt đầu chạy (sau khi gọistart()
), Python sẽ gây ra một lỗiRuntimeError
. 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ứcstart()
. Điều này gây ra lỗiRuntimeError
vì thuộc tínhdaemon
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ọistart()
.
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, VPS và domain 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!