web-dev-qa-db-fra.com

Méthode de threading setDaemon ().

Je suis un débutant dans la programmation python, ce que je comprends, c'est qu'un processus peut être un démon, mais un thread en mode démon, je ne pouvais pas comprendre le cas d'utilisation de cela, je demanderais les python gourous pour m'aider à comprendre cela.

27
hue

Voici un code de base utilisant le filetage:

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()

Lorsque vous l'exécutez, vous obtenez

% test.py
0
1
2
3
got here

Maintenant, commentez la ligne:

         t.daemon = True

Exécutez-le à nouveau et vous verrez que le script imprime le même résultat, mais se bloque. Le fil principal se termine (notez que got here a été imprimé), mais le deuxième fil ne se termine jamais.

En revanche, lorsque t.daemon est défini sur True, le thread t se termine à la fin du thread principal.

Notez que les "threads démon" ont peu à voir avec processus démon .

38
unutbu

La file d'attente du module a été renommée file d'attente en commençant par Python3 pour mieux refléter le fait qu'il existe plusieurs classes de files d'attente (lifo, fifo, priorité) dans le module. veuillez donc apporter les modifications en utilisant cet exemple

2
code

J'ai adapté la réponse de @ unutbu pour python 3. Assurez-vous que vous exécutez ce script à partir de la ligne de commande et non d'un environnement interactif comme le cahier jupyter.

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()

Ainsi, lorsque vous commentez la ligne du démon, vous remarquerez que le programme ne se termine pas, vous devrez l'interrompre manuellement. Définir les threads en threads démon garantit qu'ils sont tués une fois qu'ils ont terminé.

Remarque: vous pourriez obtenir la même chose ici sans threads démon, si vous remplaciez la boucle while infinie par une autre condition:

def basic_worker(q):
        while not q.empty():
            item = q.get()
            # do_work(item)
            print(item)
            q.task_done()
0
Picard