Подтвердить что ты не робот

SetDaemon() метод потоков.

Я новичок в программировании на Python, я понимаю, что процесс может быть демоном, но поток в режиме демона, я не мог понять сценарий использования этого, я бы попросил гуру Python помочь мне в понимании этого,

4b9b3361

Ответ 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.