Я новичок в программировании на Python, я понимаю, что процесс может быть демоном, но поток в режиме демона, я не мог понять сценарий использования этого, я бы попросил гуру Python помочь мне в понимании этого,
SetDaemon() метод потоков.
Ответ 1
Вот некоторый базовый код, использующий threading:
import Queue
import threading
def basic_worker(queue):
while True:
item = queue.get()
# do_work(item)
print(item)
queue.task_done()
def basic():
# http://docs.python.org/library/queue.html
queue = Queue.Queue()
for i in range(3):
t = threading.Thread(target=basic_worker,args=(queue,))
t.daemon = True
t.start()
for item in range(4):
queue.put(item)
queue.join() # block until all tasks are done
print('got here')
basic()
Когда вы запустите его, вы получите
% test.py
0
1
2
3
got here
Теперь закомментируйте строку:
t.daemon = True
Запустите его снова, и вы увидите, что script печатает тот же результат, но зависает.
Основной поток заканчивается (обратите внимание, что got here
был напечатан), но вторая нить никогда не заканчивается.
В отличие от этого, когда t.daemon
установлен на True
, поток t
заканчивается, когда заканчивается основной поток.
Обратите внимание, что "потоки демонов" имеют мало общего с процессами daemon .
Ответ 2
Очередь модулей была переименована в очередь, начиная с Python3, чтобы лучше отражать тот факт, что в модуле имеется несколько классов очередей (lifo, fifo, priority). поэтому, пожалуйста, внесите изменения, используя этот пример
Ответ 3
Я адаптировал ответ @unutbu для python 3. Убедитесь, что вы запускаете этот скрипт из командной строки, а не какую-то интерактивную среду, такую как jupyter notebook.
import queue
import threading
def basic_worker(q):
while True:
item = q.get()
# do_work(item)
print(item)
q.task_done()
def basic():
q = queue.Queue()
for item in range(4):
q.put(item)
for i in range(3):
t = threading.Thread(target=basic_worker,args=(q,))
t.daemon = True
t.start()
q.join() # block until all tasks are done
print('got here')
basic()
Поэтому, когда вы закомментируете строку демона, вы заметите, что программа не завершает работу, вам придется прервать ее вручную. Установка потоков в потоки демонов гарантирует, что они будут уничтожены после их завершения.
Примечание: вы могли бы добиться того же самого и без потоков демона, если бы заменили бесконечный цикл while другим условием:
def basic_worker(q):
while not q.empty():
item = q.get()
# do_work(item)
print(item)
q.task_done()
Ответ 4
Похоже, что люди намерены использовать Queue для объяснения потоков, но я думаю, что должен быть гораздо более простой способ, с помощью time.sleep()
, показать демо-поток.
Создайте поток демона, установив параметр daemon
(по умолчанию None):
from threading import Thread
import time
def worker():
time.sleep(3)
print('daemon done')
thread = Thread(target=worker, daemon=True)
thread.start()
print('main done')
Выход:
main done
Process finished with exit code 0
Удалите аргумент демона, например:
thread = Thread(target=worker)
Перезапустите и посмотрите вывод:
main done
daemon done
Process finished with exit code 0
Здесь мы уже видим разницу потока демонов:
Вся программа Python может завершиться, если останется только поток демона.
isDaemon()
и setDaemon()
- старые API получения/установки. Рекомендуется использовать аргумент конструктора, как указано выше, или свойство daemon
.