Daemon trong chủ đề python là gì?

Trong bài viết này, tôi sẽ thảo luận về các chuỗi Daemon trong Python với các ví dụ. Vui lòng đọc bài viết trước của chúng tôi, nơi chúng tôi đã thảo luận về Các phương thức quan trọng của lớp Thread trong Python.  Chủ đề Daemon là gì?

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ác

Bấ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 python

Chú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.  

Một số điểm cần lưu ý
  1. 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
  2. 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
  3. Do đó, Main Thread sẽ luôn là Non Daemon thread
  4. 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ẹ
  5. Nếu luồng cha là Daemon thì mặc định luồng con cũng là Daemon
  6. Nếu Parent Thread là Non-Daemon, thì ChildThread mặc định cũng là Non-Daemon
  7. 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
Chương trình. Chủ đề chính luôn là Non-Daemon trong Python [demo16. 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 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

daemon trong luồng là gì?

Luồng Daemon trong Java là một luồng có mức độ ưu tiên thấp chạy trong nền để thực hiện các tác vụ như thu gom rác . Daemon thread trong Java cũng là một thread của nhà cung cấp dịch vụ cung cấp các dịch vụ cho user thread.

Quá trình daemon Python là gì?

Daemon xử lý trong Python . Các quy trình daemon hoặc các quy trình đang chạy trong nền tuân theo khái niệm tương tự như các luồng daemon . Để thực thi quy trình ở chế độ nền, chúng ta cần đặt cờ daemonic thành true.

Các chủ đề Python có phải là daemon theo mặc định không?

Luồng chính là luồng mặc định được tạo trong quy trình Python. Theo mặc định, chuỗi này không phải là chuỗi daemon . Một quy trình Python sẽ thoát khi tất cả các luồng không phải daemon đã kết thúc.

chủ đề daemon với ví dụ là gì?

Luồng daemon là luồng không ngăn JVM thoát khi chương trình kết thúc nhưng luồng vẫn đang chạy . Một ví dụ cho luồng daemon là bộ sưu tập rác. Bạn có thể sử dụng phương thức setDaemon[boolean] để thay đổi thuộc tính daemon của Thread trước khi thread bắt đầu.

Chủ Đề