Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Các luồng Daemon trong Python
Trong bài viết này, bạn sẽ học về các luồng daemon trong Python và cách sử dụng chúng hiệu quả. Python cung cấp khả năng tạo và quản lý các luồng, cho phép bạn thực hiện các tác vụ đồng thời. Điều này đặc biệt hữu ích khi bạn muốn thực hiện các tác vụ ở chế độ nền mà không ảnh hưởng đến luồng chính của chương trình. Bằng cách sử dụng các luồng daemon, bạn có thể đảm bảo rằng các tác vụ nền này sẽ tự động kết thúc khi chương trình chính kết thúc, giúp tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả hơn.
Giới thiệu về luồng daemon trong Python
Trong Python, mọi chương trình đều có ít nhất một luồng gọi là luồng chính (main thread). Để tạo một chương trình có nhiều luồng, bạn sử dụng module threading
. Bằng cách sử dụng nhiều luồng, bạn có thể thực hiện các tác vụ đồng thời.
Đôi khi, bạn muốn thực hiện một tác vụ ở chế độ nền. Để làm điều đó, bạn sử dụng một loại luồng đặc biệt gọi là luồng daemon.
Theo định nghĩa, các luồng daemon là các luồng chạy ở chế độ nền. Nói cách khác, các luồng daemon thực hiện các tác vụ ở chế độ nền.
Bài viết này được đăng tại [free tuts .net]
Các luồng daemon rất hữu ích cho việc thực hiện các tác vụ hỗ trợ cho các luồng không phải daemon trong chương trình. Ví dụ:
- Ghi log thông tin vào một tệp ở chế độ nền.
- Thu thập nội dung từ một trang web ở chế độ nền.
- Tự động lưu dữ liệu vào cơ sở dữ liệu ở chế độ nền.
Tạo một luồng daemon trong Python
Để tạo một luồng daemon, bạn đặt thuộc tính daemon
thành True
trong hàm khởi tạo Thread
:
t = Thread(target=f, daemon=True)
Hoặc, bạn có thể đặt thuộc tính daemon
thành True
sau khi tạo đối tượng Thread
:
t = Thread(target=f) t.daemon = True
Ví dụ về luồng daemon trong Python
Ví dụ sau đây cho thấy cách tạo một luồng không phải daemon để hiển thị số giây mà chương trình đã chờ:
from threading import Thread import time def show_timer(): count = 0 while True: count += 1 time.sleep(1) print(f'Đã chờ {count} giây...') t = Thread(target=show_timer) t.start() answer = input('Bạn có muốn thoát không?\n')
Cách hoạt động:
Đầu tiên, định nghĩa một hàm show_timer()
để hiển thị số giây mà chương trình đã chờ.
Sau đó, tạo một luồng mới để thực thi hàm show_timer()
:
t = Thread(target=show_timer)
Tiếp theo, khởi động luồng:
t.start()
Cuối cùng, gọi hàm input()
để nhắc người dùng nhập liệu:
answer = input('Bạn có muốn thoát không?\n')
Nếu bạn chạy chương trình, nó sẽ hiển thị kết quả sau và chạy mãi mãi:
Bạn có muốn thoát không?Đã chờ 1 giây... Đã chờ 2 giây... Đã chờ 3 giây... Đã chờ 4 giây... Y Đã chờ 5 giây... Đã chờ 6 giây...
Để kết thúc chương trình, bạn cần phải dừng terminal.
Chương trình chạy vô hạn vì luồng t
là một luồng không phải daemon. Chương trình cần chờ tất cả các luồng không phải daemon hoàn thành trước khi thoát.
Bây giờ, hãy biến đổi luồng này thành một luồng daemon:
from threading import Thread import time def show_timer(): count = 0 while True: count += 1 time.sleep(1) print(f'Đã chờ {count} giây...') t = Thread(target=show_timer, daemon=True) t.start() answer = input('Bạn có muốn thoát không?\n')
Nếu bạn chạy chương trình, nhập liệu và nhấn enter, chương trình sẽ kết thúc. Ví dụ:
Bạn có muốn thoát không? Đã chờ 1 giây... Y
Chương trình kết thúc vì nó không cần chờ luồng daemon hoàn thành. Ngoài ra, luồng daemon sẽ tự động bị dừng khi chương trình thoát.
Sự khác biệt giữa luồng daemon và luồng không phải daemon trong Python
Bảng dưới đây minh họa sự khác biệt giữa luồng daemon và luồng không phải daemon:
Luồng Daemon | Luồng Không Phải Daemon |
---|---|
Tạo luồng | t = Thread(target=f, daemon=True) |
Chương trình cần chờ trước khi thoát | Không |
Loại tác vụ |
Không quan trọng như ghi log |
Kết bài
Luồng daemon là một công cụ hữu ích trong Python để xử lý các tác vụ nền không quan trọng. Với khả năng tự động dừng khi chương trình chính kết thúc, luồng daemon giúp đảm bảo rằng các tài nguyên được giải phóng đúng cách và chương trình có thể thoát mà không cần chờ đợi. Điều này giúp tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả, đặc biệt là khi xử lý các tác vụ không quan trọng như ghi log, quét dữ liệu hoặc tự động lưu dữ liệu. Việc sử dụng luồng daemon đúng cách sẽ giúp bạn xây dựng các ứng dụng Python mạnh mẽ và hiệu quả hơn.