Giải thích chủ đề Daemon


237

Trong tài liệu Python có ghi :

Một chủ đề có thể được gắn cờ là một "chủ đề daemon". Tầm quan trọng của cờ này là toàn bộ chương trình Python thoát khi chỉ còn lại các luồng daemon. Giá trị ban đầu được kế thừa từ luồng tạo.

Có ai có một lời giải thích rõ ràng hơn về điều đó có nghĩa là gì hoặc một ví dụ thực tế cho thấy nơi bạn sẽ đặt chủ đề là daemonic?

Làm rõ điều đó cho tôi: vì vậy tình huống duy nhất bạn không đặt chủ đề là daemonic, khi nào bạn muốn chúng tiếp tục chạy sau khi thoát chủ đề chính?

Câu trả lời:


447

Một số luồng thực hiện các tác vụ nền, như gửi các gói giữ nguyên hoặc thực hiện thu gom rác định kỳ hoặc bất cứ thứ gì. Chúng chỉ hữu ích khi chương trình chính đang chạy, và bạn có thể tắt chúng ngay khi các luồng khác, không phải daemon, đã thoát.

Không có chủ đề daemon, bạn phải theo dõi chúng và bảo họ thoát ra, trước khi chương trình của bạn hoàn toàn có thể thoát. Bằng cách đặt chúng làm chủ đề daemon, bạn có thể cho phép chúng chạy và quên chúng, và khi chương trình của bạn thoát, mọi luồng daemon sẽ tự động bị giết.


1
Vì vậy, nếu tôi có một luồng con đang thực hiện thao tác ghi tệp được đặt thành không phải deamon, điều đó có nghĩa là tôi phải làm cho nó thoát ra một cách rõ ràng?
Ciasto piekarz

8
@san Chủ đề nhà văn của bạn làm gì sau khi viết xong? Nó chỉ trở về? Nếu vậy, thế là đủ. Chủ đề Daemon thường dành cho những thứ chạy trong một vòng lặp và không tự thoát ra.
Chris Jester-Young

Nó không làm gì cả, cũng không trả về, mục đích duy nhất của nó là thực hiện thao tác ghi tệp
Ciasto piekarz

2
@san Nếu nó rơi xuống dưới cùng của hàm thread, nó sẽ trả về ngầm.
Chris Jester-Young

Nó trả về Nonetrong trường hợp đó, nhưng không thành vấn đề, giá trị trả về không được sử dụng.
Chris Jester-Young

30

Giả sử bạn đang tạo một số loại tiện ích bảng điều khiển. Là một phần của điều này, bạn muốn nó hiển thị số lượng tin nhắn chưa đọc trong hộp thư điện tử của bạn. Vì vậy, bạn thực hiện một chủ đề nhỏ sẽ:

  1. Kết nối với máy chủ thư và hỏi bạn có bao nhiêu thư chưa đọc.
  2. Báo hiệu GUI với số lượng cập nhật.
  3. Ngủ một lát.

Khi widget của bạn khởi động, nó sẽ tạo chủ đề này, chỉ định nó là daemon và khởi động nó. Bởi vì đó là một daemon, bạn không cần phải suy nghĩ về nó; khi widget của bạn thoát, chuỗi sẽ tự động dừng lại.


18

Các áp phích khác đã đưa ra một số ví dụ cho các tình huống trong đó bạn sử dụng các chủ đề daemon. Tuy nhiên, khuyến nghị của tôi là không bao giờ sử dụng chúng.

Không phải vì chúng không hữu ích, mà vì có một số tác dụng phụ xấu mà bạn có thể gặp phải nếu sử dụng chúng. Các chủ đề của Daemon vẫn có thể thực thi sau khi bộ thực thi Python bắt đầu phá bỏ mọi thứ trong luồng chính, gây ra một số ngoại lệ khá kỳ quái.

Thêm thông tin ở đây:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-F / 2 / 343697.html

Nói đúng ra bạn không bao giờ cần đến chúng, nó chỉ giúp việc thực hiện dễ dàng hơn trong một số trường hợp.


Vẫn còn vấn đề này với python 3? Không có thông tin rõ ràng về những "ngoại lệ kỳ lạ" này trong tài liệu.
kheraud

5
Từ bài đăng trên blog của Joe: "Cập nhật tháng 6 năm 2015: Đây là lỗi Python 1856. Nó đã được sửa trong Python 3.2.1 và 3.3, nhưng bản sửa lỗi không bao giờ được nhập vào 2.x. (Một nỗ lực để nhập vào nhánh 2.7 đã gây ra lỗi khác và nó đã bị bỏ rơi.) Các chủ đề của Daemon có thể ổn trong Python> = 3.2.1, nhưng chắc chắn không có trong các phiên bản trước. "
clacke

Tôi muốn chia sẻ ở đây kinh nghiệm của tôi: Tôi đã có một chức năng được sinh ra là Chủ đề nhiều lần. Bên trong nó, tôi có một phiên bản của Python loggingvà tôi dự đoán rằng, sau khi hoàn thành Thread, tất cả các đối tượng (Mô tả tệp cho mỗi luồng / Hàm), sẽ bị hủy. Vào cuối chương trình của tôi, tôi đã thấy nhiều kết quả như thế nào IOError: [Errno 24] Too many open files:. Với lsof -p pid_of_program, tôi phát hiện ra rằng các FD đã mở, thậm chí khó khăn, Thread / Function đã hoàn thành công việc của họ. Cách giải quyết? Loại bỏ trình xử lý nhật ký ở cuối hàm. Vì vậy, daemonicChủ đề, không đáng tin cậy ...
ivanleoncz

17

Một cách đơn giản hơn để suy nghĩ về nó, có lẽ: khi chính trở về, quy trình của bạn sẽ không thoát nếu có các luồng không phải daemon vẫn đang chạy.

Một lời khuyên: Tắt máy sạch sẽ dễ bị lỗi khi liên quan đến chủ đề và đồng bộ hóa - nếu bạn có thể tránh được, hãy làm như vậy. Sử dụng chủ đề daemon bất cứ khi nào có thể.


13

Chris đã giải thích chủ đề daemon là gì, vì vậy hãy nói về cách sử dụng thực tế. Nhiều triển khai nhóm luồng sử dụng các luồng daemon cho các nhân viên tác vụ. Công nhân là các luồng thực thi các nhiệm vụ từ hàng đợi nhiệm vụ.

Công nhân cần tiếp tục chờ đợi các nhiệm vụ trong hàng đợi nhiệm vụ vô thời hạn vì họ không biết khi nào nhiệm vụ mới sẽ xuất hiện. Chủ đề phân công nhiệm vụ (nói chủ đề chính) chỉ biết khi nhiệm vụ kết thúc. Chủ đề chính chờ trên hàng đợi nhiệm vụ để trống và sau đó thoát. Nếu công nhân là các luồng người dùng, tức là không phải daemon, chương trình sẽ không kết thúc. Nó sẽ tiếp tục chờ đợi những công nhân chạy vô thời hạn này, mặc dù công nhân không làm gì hữu ích. Đánh dấu các chủ đề daemon và chủ đề chính sẽ xử lý việc tiêu diệt chúng ngay khi hoàn thành các nhiệm vụ xử lý.


4
Hãy cẩn thận với điều đó! Nếu một chương trình gửi một tác vụ quan trọng (ví dụ: cập nhật một số tệp "trong nền") vào hàng đợi tác vụ daemon, thì có nguy cơ chương trình có thể chấm dứt trước khi thực hiện tác vụ, hoặc tệ hơn là ở giữa cập nhật tệp đó.
Solomon chậm

10

Trích dẫn Chris: "... khi chương trình của bạn thoát, mọi luồng daemon sẽ tự động bị hủy.". Tôi nghĩ rằng tiền nó lên. Bạn nên cẩn thận khi bạn sử dụng chúng khi chúng đột ngột chấm dứt khi chương trình chính thực thi đến khi hoàn thành.


4

Khi luồng thứ hai của bạn không phải là Daemon, luồng chính chính của ứng dụng của bạn không thể thoát vì tiêu chí thoát của nó cũng được gắn với lối thoát của (các) luồng không phải Daemon. Chủ đề không thể bị giết chết trong python, do đó ứng dụng của bạn sẽ phải thực sự chờ đợi (các) chủ đề không phải Daemon thoát ra. Nếu hành vi này không phải là điều bạn muốn, thì hãy đặt luồng thứ hai của bạn làm daemon để nó không giữ ứng dụng của bạn thoát khỏi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.