Maison  >  Article  >  développement back-end  >  Utilisation du module file d'attente (file d'attente) sous le thread Python (avec exemples)

Utilisation du module file d'attente (file d'attente) sous le thread Python (avec exemples)

不言
不言original
2018-09-11 16:48:452286parcourir

Ce que cet article vous apporte concerne l'utilisation du module file d'attente (file d'attente) sous les threads Python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Le module de file d'attente implémente diverses files d'attente [multi-producteur-multi-consommateur]. Peut être utilisé pour échanger en toute sécurité des informations entre plusieurs threads d’exécution.

Le module de file d'attente définit 3 classes de file d'attente différentes.

3 classes de file d'attente différentes

q=Queue(maxsize) : Créez une file d'attente FIFO (premier entré, premier sorti, premier entré, premier sorti). maxsize est le nombre maximum d'éléments pouvant être placés dans la file d'attente.
Si le paramètre maxsize est omis ou défini sur 0, la taille de la file d'attente sera infinie.

q=LifoQueue(maxsize) : Créez une file d'attente (pile) LIFO (dernier entré, premier sorti, dernier entré, premier sorti).

q=PriorityQueue(maxsize) : Créez une file d'attente prioritaire dans laquelle les éléments sont classés de faible à haute priorité.
Lors de l'utilisation de ce type de file d'attente, l'élément doit être un tuple du formulaire (priorité, données), où priorité est un nombre identifiant la priorité.

Méthodes communes

q.size() : renvoie la taille correcte de la file d'attente. Étant donné que d'autres threads peuvent mettre à jour cette file d'attente, le nombre renvoyé par cette méthode n'est pas fiable.

q.empty() : Si la file d'attente est vide, renvoie True, sinon renvoie False.

q.full() : Si la file d'attente est pleine, renvoie True, sinon renvoie False.

q.put(item, block, timeout) : Mettre l'élément dans la file d'attente.
Si le blocage est défini sur Vrai (valeur par défaut), l'appelant sera bloqué jusqu'à ce qu'une position libre disponible apparaisse dans la file d'attente.
Si block est défini sur False, cette méthode lèvera une exception Full lorsque la file d'attente est pleine.

q.put_nowait(item) : Équivalent à q.put(item,False)

q.get(block, timeout) : Supprimer un élément de la file d'attente et renvoyer l'élément .
Si le blocage est défini sur Vrai (valeur par défaut), l'appelant bloquera jusqu'à ce qu'il y ait un temps d'inactivité disponible dans la file d'attente.
Si block est défini sur False, une exception Empty sera levée lorsque la file d'attente est vide.
timeout fournit une valeur de délai d'attente facultative en secondes. S'il expire, une exception vide sera levée.

q.get_nowait() : équivalent à get(0)

q.task_done() : utilisé par les consommateurs de données dans la file d'attente pour indiquer que le traitement de l'élément est terminé. Si vous utilisez cette méthode, elle doit être appelée une fois pour chaque élément supprimé de la file d'attente.

q.join() : bloque jusqu'à ce que tous les éléments de la file d'attente aient été supprimés et traités. Cette méthode reviendra directement une fois que la méthode q.task_done() aura été appelée une fois pour chaque élément de la file d'attente.

Exemple :

L'utilisation de files d'attente peut généralement simplifier les programmes multithread. Par exemple, vous pouvez utiliser des files d'attente partagées pour connecter des threads entre eux sans avoir recours à des verrous pour la protection.

Dans ce modèle, le thread de travail agit généralement en tant que consommateur de données.

from threading import Thread
from queue import Queue
class WorkerThread(Thread):
    def __init__(self,*args,**kwargs):
        Thread.__init__(self,*args,**kwargs)
        self.input_queue=Queue()

    def send(self,item):
        self.input_queue.put(item)
    def close(self):
        self.input_queue.put(None)
        self.input_queue.join()
    def run(self):
        while True:
            item=self.input_queue.get()
            if item is None:
                break
            #实际开发中,此处应该使用有用的工作代替
            print(item)
            self.input_queue.task_done()
        #完成,指示收到和返回哨兵
        self.input_queue.task_done()
        return

if __name__=="__main__":
    w=WorkerThread()
    w.start()
    w.send("php")
    w.send("中")
    w.send("文")
    w.send("网")
    w.close()

Résultats d'exécution :

php
中
文
网

Recommandations associées :

Analyse complète du principe de la file d'attente prioritaire des threads Python

Méthode de synchronisation des threads utilisant Queue et Condition en Python

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