Maison  >  Article  >  développement back-end  >  Analyse complète du principe de la file d'attente prioritaire des threads Python (file d'attente)

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

Tomorin
Tomorinoriginal
2018-08-16 17:38:243100parcourir

Le module Queue de Python fournit des classes de files d'attente synchrones et sécurisées pour les threads, notamment la file d'attente FIFO (premier entré, premier sorti), la file d'attente LIFO (dernier entré, premier sorti) LifoQueue et la file d'attente prioritaire PriorityQueue . Ces files d'attente implémentent des primitives de verrouillage et peuvent être utilisées directement en multi-threads. Les files d'attente peuvent être utilisées pour réaliser la synchronisation entre les threads.

Méthodes courantes dans le module Queue :

1.Queue.qsize() Renvoie la taille de la file d'attente

2.Queue.empty() Si la file d'attente est vide , renvoie True , Sinon False

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

4.Queue.full correspond à la taille maxsize

5.Queue .get([block[, timeout]]) obtient la file d'attente, délai d'attente

6.Queue.get_nowait() est équivalent à Queue.get(False)

7.Queue.put(item ) Écrivez dans la file d'attente, délai d'attente

8.Queue.put_nowait(item) est équivalent à Queue.put(item, False)

9. Queue.task_done() après avoir terminé un travail, la fonction Queue.task_done() envoie un signal à la file d'attente où la tâche a été terminée

10.Queue.join() signifie en fait attendre que la file d'attente soit vide avant d'effectuer d'autres opérations

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import Queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print "Starting " + self.name
process_data(self.name, self.q)
print "Exiting " + self.name
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print "%s processing %s" % (threadName, data)
else:queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1
# 创建新线程
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# 填充队列
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# 等待队列清空
while not workQueue.empty():
pass
# 通知线程是时候退出
exitFlag = 1
# 等待所有线程完成
for t in threads:
t.join()
print "Exiting Main Thread"

Résultats de l'exécution du programme ci-dessus :

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread


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