Пояснення демонів


237

У документації Python написано:

Нитка може бути позначена як "демонова нитка". Значення цього прапора полягає в тому, що вся програма Python виходить, коли залишаються лише демонові нитки. Початкове значення успадковується від створюючої нитки.

Хтось має більш чітке пояснення того, що це означає, або практичний приклад, де можна вказати тему daemonic?

Поясніть це для мене: тож єдиною ситуацією, для якої ви б не встановили потоки як daemonic, є те, коли ви хочете, щоб вони продовжували працювати після виходу основного потоку?

Відповіді:


448

Деякі потоки виконують фонові завдання, такі як надсилання пакунків із збереженням, або періодичне збирання сміття чи будь-що інше. Вони корисні лише тоді, коли запускається основна програма, і нормально знищити їх, як тільки інші, недемонові потоки вийдуть.

Без демонових потоків вам доведеться відстежувати їх і казати їм вийти, перш ніж ваша програма може повністю вийти. Встановивши їх як демонові нитки, ви можете дозволити їм працювати і забути про них, а коли ваша програма завершиться, будь-які демонові нитки вбиваються автоматично.


1
Отже, якщо у мене є дочірня нитка, яка виконує операцію запису файлів, встановлену на недемон, чи це означає, що я повинен зробити це явно вихід?
Ciasto piekarz

8
@san Що робить ваш твір письменника після того, як він закінчив писати? Це просто повертається? Якщо так, то цього достатньо. Нитки Демона зазвичай стосуються речей, які працюють у циклі і не виходять самостійно.
Кріс Єстер-Янг

Це нічого не робить, не повертає, єдина його мета - виконувати операцію запису файлів
Ciasto piekarz

2
@san Якщо вона випадає з низу функції потоку, вона повертається неявно.
Кріс Єстер-Янг

У Noneцьому випадку він повертається , але це не має значення, значення повернення не використовується.
Кріс Єстер-Янг

30

Скажімо, ви робите якийсь віджет приладної панелі. В рамках цього ви хочете, щоб воно відображало кількість непрочитаних повідомлень у вашому електронному полі. Отже, ви зробите невелику нитку, яка буде:

  1. Підключіться до поштового сервера і запитайте, скільки у вас є непрочитаних повідомлень.
  2. Підпишіть графічний інтерфейс із оновленим підрахунком.
  3. Трохи спати.

Коли ваш віджет запускається, він створить цю нитку, призначить її демон і запустить її. Оскільки це демон, вам не потрібно думати про це; коли ваш віджет вийде, потік автоматично зупиниться.


18

Інші плакати наводили кілька прикладів для ситуацій, у яких ви використовували б демонові нитки. Однак моя рекомендація ніколи не використовувати їх.

Це не тому, що вони не корисні, а тому, що є деякі погані побічні ефекти, які ви можете відчути, якщо їх використовувати. Нитки Daemon все ще можуть виконуватись після того, як час виконання Python почне зривати речі в основному потоці, викликаючи деякі досить химерні винятки.

Більше інформації тут:

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

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

Строго кажучи, що вони вам ніколи не потрібні, це просто полегшує реалізацію в деяких випадках.


Все ще ця проблема з python 3? У цих документах немає чіткої інформації щодо цих "химерних винятків".
kheraud

5
З публікації щоденника Джо: "Оновлення червня 2015 року: це помилка Python 1856 р . Вона була виправлена ​​в Python 3.2.1 та 3.3, але виправлення ніколи не підтримувалось до 2.x. (Спроба репортажу до відділення 2.7 спричинила ще одну помилку і це було відмовлено.) Нитки Daemon можуть бути в порядку в Python> = 3.2.1, але, безумовно, немає у попередніх версіях. "
clacke

Я хотів би поділитися тут своїм досвідом: у мене функція була породжена як Thread кілька разів. Всередині нього у мене був екземпляр Python, loggingі я очікував, що після закінчення теми, всі об'єкти (Дескриптори файлів для кожної теми / функції) будуть знищені. Наприкінці своєї програми я побачив багато подібних результатів IOError: [Errno 24] Too many open files:. З lsof -p pid_of_program, я виявив, що FD відкриті, навіть жорсткі теми / функції закінчили свою роботу. Обхід? Видалення обробника журналу в кінці функції. Отже, daemonicНитки, ненадійні ...
ivanleoncz

17

Можливо, простіший спосіб подумати над цим: коли основний повертається, ваш процес не вийде, якщо все ще запущені недемонние потоки.

Порада: чисте відключення легко помилитися, коли задіяні потоки та синхронізація - якщо ви можете цього уникнути, зробіть це. Використовуйте демонові нитки, коли це можливо.


13

Кріс уже пояснив, що таке демонові нитки, тому поговоримо про практичне використання. Багато реалізацій пулу потоків використовують потоки демонів для працівників завдань. Робітники - це потоки, які виконують завдання з черги завдань.

Працівник повинен постійно чекати завдань у черзі завдань нескінченно, оскільки вони не знають, коли з’явиться нове завдання. Тема, яка призначає завдання (скажімо, головна нитка), знає лише, коли завдання закінчені. Основна тема чекає в черзі завдань, щоб вона порожня, а потім виходить. Якщо працівники є потоками користувачів, тобто недемон, програма не припиняється. Він буде постійно чекати цих нескінченно працюючих працівників, хоча працівники не роблять нічого корисного. Позначте робітників демоновими нитками, і головна нитка подбає про їх вбивство, як тільки буде виконано завдання з обробки.


4
Будьте обережні з цим! Якщо програма подає важливу задачу (наприклад, оновити якийсь файл "у фоновому режимі") у черзі завдань демона, то існує ризик, що програма може завершитися перед виконанням завдання, або ще гірше, посеред оновлення цього файлу.
Соломон повільно

10

Цитуючи Кріса: "... коли ваша програма замикається, будь-які демонові нитки вбиваються автоматично." Я думаю, що це підсумовує. Ви повинні бути обережними при їх використанні, оскільки вони різко припиняються, коли основна програма виконується до завершення.


4

Якщо ваш другий потік не є Daemon, основний основний потік вашої програми не може вийти, оскільки його критерії виходу прив’язані до виходу також і недемонських потоків. Нитки не можуть бути насильно вбиті в python, тому вашій програмі доведеться дійсно чекати, поки вихід недемонів (ниток) не завершиться. Якщо така поведінка не є тим, що ви хочете, то встановіть свою другу нитку як демон, щоб вона не стримувала роботу вашої програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.