Maison  >  Article  >  développement back-end  >  Explication détaillée du module de file d'attente de Python

Explication détaillée du module de file d'attente de Python

巴扎黑
巴扎黑original
2017-07-19 13:16:572266parcourir

Queue

Queue est une implémentation de file d'attente thread-safe (FIFO) dans la bibliothèque standard Python. Elle fournit une structure de données premier entré, premier sorti adaptée à la programmation multithread, c'est-à-dire une. file d'attente, qui est utilisée dans les producteurs Transfert d'informations entre les threads consommateurs

File d'attente FIFO de base

class Queue.Queue(maxsize=0)

FIFO est Premier entré, premier sorti, premier entré, premier sorti. Queue fournit un conteneur FIFO de base, très simple à utiliser. maxsize est un entier, indiquant la limite supérieure du nombre de données pouvant être stockées dans la file d'attente. Une fois la limite atteinte, l'insertion provoquera un blocage jusqu'à ce que les données de la file d'attente soient consommées. Si maxsize est inférieur ou égal à 0, il n’y a aucune limite sur la taille de la file d’attente.

Par exemple :

1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

Sortie :

01
2
3
4

File d'attente LIFO

class Queue.LifoQueue(maxsize=0)

LIFO est Dernier entré, premier sorti, dernier entré, premier sorti. Semblable à la stack, il est très simple à utiliser. L'utilisation de maxsize est la même que ci-dessus

Autre exemple :

1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

<.>Sortie :

4
3
2
10

Vous pouvez voir qu'il suffit de remplacer

par Queue.Quenu类Queue.LifiQueue类

file d'attente prioritaire

class Queue.PriorityQueue(maxsize=0)

Construction une file d'attente prioritaire. L'utilisation de maxsize est la même que ci-dessus.

import Queueimport threadingclass Job(object):def __init__(self, priority, description):
        self.priority = priority
        self.description = descriptionprint 'Job:',descriptionreturndef __cmp__(self, other):return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))def process_job(q):while True:
        next_job = q.get()print 'for:', next_job.description
        q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),
        threading.Thread(target=process_job, args=(q,))
        ]for w in workers:
    w.setDaemon(True)
    w.start()

q.join()
结果
Job: level 3 job
Job: level 10 job
Job: level 1 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job

Certaines méthodes courantes

task_done()

signifie rejoindre la file d'attente avant Une des tâches est terminée. Appelé par le thread consommateur de la file d'attente. Chaque appel get() obtient une tâche et l'appel task_done() suivant indique à la file d'attente que la tâche a été traitée.

Si la join() actuelle bloque, elle reprendra l'exécution lorsque toutes les tâches de la file d'attente seront traitées (c'est-à-dire que chaque tâche mise en file d'attente par put() a un appel task_done() correspondant).

join()

Bloque le thread appelant jusqu'à ce que toutes les tâches de la file d'attente soient traitées.

Tant que des données sont ajoutées à la file d'attente, le nombre de tâches inachevées augmentera. Lorsque le thread consommateur appelle task_done() (ce qui signifie qu'un consommateur obtient la tâche et la termine), le nombre de tâches inachevées sera réduit. Lorsque le nombre de tâches inachevées tombe à 0, join() se débloque.

put(item[, block[, timeout]])

Mettre l'élément dans la file d'attente.

  1. Si le paramètre facultatif block est True et que timeout est un objet vide (par défaut, appel bloquant, pas de timeout).

  2. Si le délai d'attente est un entier positif, le processus d'appel sera bloqué pendant un délai d'attente pouvant aller jusqu'à quelques secondes. S'il n'y a pas d'espace vide disponible, une exception complète (blocage d'appel avec délai d'attente) sera émise. jeté.

  3. Si le bloc est False, mettez les données dans la file d'attente s'il y a de l'espace libre disponible, sinon lancez immédiatement une exception complète

Ce n'est pas -version bloquante Pour

équivaut à put_nowaitput(item, False)

get([block[, timeout]])

supprime et renvoie un élément de la file d'attente. Les paramètres de blocage et de délai d'attente sont les mêmes que ceux de la méthode

put

. Sa méthode non bloquante est `get_nowait()`, qui équivaut à

get(False)

empty()<.>

Si la file d'attente est vide, renvoie True, sinon renvoie False

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn