Khi một chương trình đang chạy, có một số quy trình, liên quan đến chương trình, sẽ chạy trong nền hỗ trợ thực thi chương trình. Các luồng hoặc quy trình đang chạy trong nền này được gọi là Chủ đề Daemon. Mục tiêu chính của Chủ đề Daemon là cung cấp hỗ trợ cho Chủ đề không phải Daemon [như chủ đề chính]
Ví dụ. người thu gom rácBất cứ khi nào Main Thread chạy với bộ nhớ thấp, ngay lập tức PVM sẽ chạy Garbage Collector để tiêu diệt các đối tượng vô dụng và cung cấp bộ nhớ trống, để Main Thread có thể tiếp tục thực thi mà không gặp bất kỳ sự cố nào về bộ nhớ
Chúng ta có thể kiểm tra xem thread có phải là Daemon hay không bằng cách sử dụng phương thức isDaemon[] của lớp Thread và cũng bằng cách sử dụng thuộc tính daemon
Chương trình. Kiểm tra Thread có phải là Daemon hay không trong Python [demo14. py]
from threading import * print[current_thread[].isDaemon[]] print[current_thread[].daemon]
đầu ra
Ghi chú. Chủ đề chính luôn là chủ đề Non-Daemon
phương thức setDaemon[] trong pythonChúng ta có thể thay đổi bản chất Daemon bằng cách sử dụng phương thức setDaemon[] của lớp Thread. Ở góc độ này, hãy biết một số điểm
Chúng ta phải đặt một luồng làm Daemon trước khi khởi động nó. Khi một luồng bắt đầu, chúng ta không thể thay đổi bản chất Daemon của nó. Nếu chúng tôi cố gắng thay đổi, chúng tôi sẽ nhận được RuntimeError. không thể đặt trạng thái daemon của chủ đề đang hoạt động
Chương trình. phương thức setDaemon[] của lớp Thread trong Python [demo15. py]
from threading import * def display[]: print["Child Thread"] t=Thread[target=display] t.start[] t.setDaemon[True]
đầu ra.
- Khi chúng ta bắt đầu thực hiện một chương trình thì Main Thread sẽ tự động bắt đầu. Chúng tôi không bắt đầu Chủ đề chính một cách rõ ràng
- Vì theo mặc định, Main Thread là Non Daemon và nó tự khởi động khi bắt đầu thực thi chương trình, nên chúng ta không thể thay đổi bản chất Non Daemon của nó thành Daemon
- Do đó, Main Thread sẽ luôn là Non Daemon thread
- Theo mặc định, các luồng mà chúng ta tạo trong chương trình sẽ kế thừa bản chất Daemon của chúng từ luồng mẹ
- Nếu luồng cha là Daemon thì mặc định luồng con cũng là Daemon
- Nếu Parent Thread là Non-Daemon, thì ChildThread mặc định cũng là Non-Daemon
- Bất cứ khi nào Chủ đề không phải Daemon cuối cùng kết thúc, tự động tất cả Chủ đề Daemon sẽ bị chấm dứt
from threading import * import time def display[]: for i in range[5]: print["Child Thread"] time.sleep[2] t=Thread[target=display] #t.setDaemon[True] t.start[] time.sleep[5] print["End Of Main Thread"]
đầu ra
Trong chương trình trên, luồng con, sẽ kế thừa bản chất daemon của nó từ luồng cha i. e Chủ đề chính, theo mặc định. Vì cả cha và con đều không phải daemon nên chúng sẽ được thực thi hoàn toàn
Chương trình. Main Thread luôn là Non-Daemon Thread trong Python [demo17. py]from threading import * import time def display[]: for i in range[5]: print["Child Thread"] time.sleep[2] t=Thread[target=display] t.setDaemon[True] t.start[] time.sleep[5] print["End Of Main Thread"]
đầu ra
Trong chương trình này, chúng tôi đã thay đổi trạng thái daemon của luồng con thành True trước khi khởi động nó
Luồng chính, không phải daemon, được hoàn thành nhanh hơn luồng con, không phải daemon. Sau khi thực thi một luồng không phải daemon, ngay lập tức quá trình thực thi luồng daemon bị dừng
Trong bài viết tiếp theo, tôi sẽ thảo luận về Đồng bộ hóa trong Python. Ở đây, trong bài viết này, tôi cố gắng giải thích các luồng Daemon quan trọng trong Python bằng các ví dụ. Tôi hy vọng bạn thích chủ đề Daemon này trong Python với bài viết Ví dụ. Tôi muốn có phản hồi của bạn. Vui lòng gửi phản hồi, câu hỏi hoặc nhận xét của bạn về bài viết này
Chào mọi người. Trong bài viết hôm nay, chúng ta sẽ xem xét việc sử dụng Daemon Threads trong Python. Trước khi chúng ta bắt đầu với chủ đề chính, trước tiên chúng ta hãy xem Daemon Thread là gì
chủ đề daemon
Daemon Thread là một loại thread có thể chạy độc lập trong nền. Các loại luồng này thực thi độc lập với luồng chính. Vì vậy, chúng được gọi là chủ đề không chặn
Khi nào bạn có thể cần chuỗi Daemon trong Python?
Giả sử bạn cần có một tác vụ chạy dài cố đọc các tệp nhật ký. Tác vụ này phải thông báo cho người dùng khi phát hiện thông báo lỗi trong nhật ký
Chúng tôi có thể chỉ định một chuỗi daemon cho tác vụ này, chuỗi này có thể tiếp tục theo dõi các tệp nhật ký của chúng tôi, trong khi chương trình chính của chúng tôi thực hiện công việc bình thường
Phần tốt nhất về các luồng daemon là chúng sẽ tự động dừng thực thi sau khi chương trình chính kết thúc
Trong trường hợp bạn cần một tác vụ ngắn, một luồng daemon sẽ ngừng thực thi sau khi nó quay trở lại. Tuy nhiên, do tính chất này, các luồng daemon được sử dụng rộng rãi cho các tác vụ nền chạy dài
Bây giờ, hãy xem một ví dụ cho thấy cách chúng ta có thể sử dụng chúng trong Python
Sử dụng Chủ đề Daemon trong Python – Triển khai thực hành
Các ví dụ này trong Python sẽ sử dụng mô-đun luồng trong Python, là một phần của thư viện chuẩn
import threading
Để minh họa sức mạnh của luồng daemon, trước tiên hãy tạo hai luồng A và B
Chúng tôi sẽ làm cho luồng A thực hiện một phép tính ngắn, trong khi luồng B cố gắng giám sát tài nguyên được chia sẻ
Nếu tài nguyên này được đặt thành True
, chúng tôi sẽ làm cho luồng B cảnh báo người dùng về trạng thái
import threading import time # Set the resource to False initially shared_resource = False # A lock for the shared resource lock = threading.Lock[] def perform_computation[]: # Thread A will call this function and manipulate the resource print[f'Thread {threading.currentThread[].name} - performing some computation....'] shared_resource = True print[f'Thread {threading.currentThread[].name} - set shared_resource to True!'] print[f'Thread {threading.currentThread[].name} - Finished!'] time.sleep[1] def monitor_resource[]: # Thread B will monitor the shared resource while shared_resource == False: time.sleep[1] print[f'Thread {threading.currentThread[].name} - Detected shared_resource = False'] time.sleep[1] print[f'Thread {threading.currentThread[].name} - Finished!'] if __name__ == '__main__': a = threading.Thread[target=perform_computation, name='A'] b = threading.Thread[target=monitor_resource, name='B'] # Now start both threads a.start[] b.start[]
Ở đây, Chủ đề A sẽ đặt
from threading import * def display[]: print["Child Thread"] t=Thread[target=display] t.start[] t.setDaemon[True]0 thành
True
và chủ đề B sẽ đợi tài nguyên này là Trueđầu ra
Thread A - performing some computation.... Thread A - set shared_resource to True! Thread A - Finished! Thread B - Detected shared_resource = False Thread B - Finished!
Lưu ý rằng cả hai chủ đề là chủ đề bình thường. Bây giờ, hãy biến luồng B thành luồng daemon. Hãy xem những gì xảy ra bây giờ
Để làm điều này, chúng ta có thể đặt nó làm tham số trong phương thức
from threading import * def display[]: print["Child Thread"] t=Thread[target=display] t.start[] t.setDaemon[True]2
import threading import time shared_resource = False # Set the resource to False initially lock = threading.Lock[] # A lock for the shared resource def perform_computation[]: # Thread A will call this function and manipulate the resource print[f'Thread {threading.currentThread[].name} - performing some computation....'] shared_resource = True print[f'Thread {threading.currentThread[].name} - set shared_resource to True!'] print[f'Thread {threading.currentThread[].name} - Finished!'] time.sleep[1] def monitor_resource[]: # Thread B will monitor the shared resource while shared_resource == False: time.sleep[1] print[f'Daemon Thread {threading.currentThread[].name} - Detected shared_resource = False'] time.sleep[1] print[f'Daemon Thread {threading.currentThread[].name} - Finished!'] if __name__ == '__main__': a = threading.Thread[target=perform_computation, name='A'] b = threading.Thread[target=monitor_resource, name='B', daemon=True] # Make thread B as a daemon thread # Now start both threads a.start[] b.start[]
đầu ra
________số 8
Ở đây, lưu ý rằng chủ đề daemon không kết thúc. Điều này là do nó sẽ tự động bị giết bởi luồng chính