Maison  >  Article  >  développement back-end  >  Module de file d'attente Python

Module de file d'attente Python

不言
不言original
2018-04-09 17:31:292281parcourir

Cet article présente principalement le module Python Queue. Maintenant, je le partage avec vous. Les amis qui en ont besoin peuvent s'y référer

En Python, la file d'attente est la forme la plus couramment utilisée pour échanger des données entre les threads. Le module Queue est un module qui fournit des opérations de file d'attente. Bien qu'il soit simple et facile à utiliser, certains accidents peuvent quand même survenir si vous n'y faites pas attention.

Créer un objet "file d'attente"
import Queue
q = Queue.Queue(maxsize = 10)
Classe Queue.Queue c'est-à-dire Il s'agit d'une implémentation synchrone d'une file d'attente. La longueur de la file d'attente peut être infinie ou finie. La longueur de la file d'attente peut être définie via le paramètre facultatif maxsize du constructeur Queue. Si maxsize est inférieur à 1, cela signifie que la longueur de la file d'attente est illimitée.

Mettre une valeur dans la file d'attente
q.put(10)
Appeler la méthode put() de l'objet file d'attente pour insérer une valeur à la fin du projet de file d'attente. put() a deux paramètres. Le premier élément est obligatoire et est la valeur de l'élément inséré ; le deuxième bloc est un paramètre facultatif et la valeur par défaut est
1. Si la file d'attente est actuellement vide et que le bloc vaut 1, la méthode put() provoque la pause du thread appelant jusqu'à ce qu'une unité de données devienne disponible. Si block vaut 0, la méthode put lèvera une exception Full.

Supprimer une valeur de la file d'attente
q.get()
Appelez la méthode get() de l'objet file d'attente pour le supprimer de la en tête de la file d'attente et renvoyer un projet. Le paramètre facultatif est block, dont la valeur par défaut est True. Si la file d'attente est vide et que block est True, get() provoque la pause du thread appelant jusqu'à ce qu'un élément soit disponible. Si la file d'attente est vide et que le bloc est False, la file d'attente lèvera une exception vide.

Le module Python Queue a trois files d'attente et constructeurs :
1 La file d'attente FIFO du module Python Queue est premier entré, premier sorti. class Queue.Queue(maxsize)
2 est similaire à un tas, c'est-à-dire premier entré, dernier sorti. class Queue.LifoQueue(maxsize)
3. Il existe une autre méthode où plus le niveau de file d'attente prioritaire est bas, plus il sort tôt. class Queue.PriorityQueue(maxsize)

Méthodes courantes dans ce package (q = Queue.Queue()) :
q.qsize() Renvoie le taille de la file d'attente
q.empty() Si la file d'attente est vide, renvoie True, sinon False
q.full() Si la file d'attente est pleine, renvoie True, sinon False
q.full correspond à la taille maxsize
q.get([block[, timeout]]) Obtient la file d'attente, le délai d'attente
q.get_nowait() est équivalent à q.get(False)
q non bloquant. put(item) écrit dans la file d'attente, le délai d'attente
q.put_nowait(item) est équivalent à q.put(item, False)
q.task_done() Après avoir terminé un travail, le q.task_done( ) la fonction envoie un signal
q.join() signifie en fait attendre que la file d'attente soit vide avant d'effectuer d'autres opérations

Exemple :
Implémenter un thread en continu Générez un nombre aléatoire dans une file d'attente (pensez à utiliser le module Queue)
Implémentez un thread pour supprimer continuellement les nombres impairs de la file d'attente ci-dessus
Implémentez un autre thread pour supprimer continuellement les nombres pairs de la file d'attente ci-dessus

#!/usr/bin/env python
#coding:utf8
import random,threading,time
from Queue import Queue
#Producer thread
class Producer(threading.Thread):
  def __init__(self, t_name, queue):
    threading.Thread.__init__(self,name=t_name)
    self.data=queue
  def run(self):
    for i in range(10):  #随机产生10个数字 ,可以修改为任意大小
      randomnum=random.randint(1,99)
      print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)
      self.data.put(randomnum) #将数据依次存入队列
      time.sleep(1)
    print "%s: %s finished!" %(time.ctime(), self.getName())
 
#Consumer thread
class Consumer_even(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self,name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_even = self.data.get(1,5) #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超时5秒
        if val_even%2==0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even)
          time.sleep(2)
        else:
          self.data.put(val_even)
          time.sleep(2)
      except:   #等待输入,超过5秒 就报异常
        print "%s: %s finished!" %(time.ctime(),self.getName())
        break
class Consumer_odd(threading.Thread):
  def __init__(self,t_name,queue):
    threading.Thread.__init__(self, name=t_name)
    self.data=queue
  def run(self):
    while 1:
      try:
        val_odd = self.data.get(1,5)
        if val_odd%2!=0:
          print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd)
          time.sleep(2)
        else:
          self.data.put(val_odd)
          time.sleep(2)
      except:
        print "%s: %s finished!" % (time.ctime(), self.getName())
        break
#Main thread
def main():
  queue = Queue()
  producer = Producer('Pro.', queue)
  consumer_even = Consumer_even('Con_even.', queue)
  consumer_odd = Consumer_odd('Con_odd.',queue)
  producer.start()
  consumer_even.start()
  consumer_odd.start()
  producer.join()
  consumer_even.join()
  consumer_odd.join()
  print 'All threads terminate!'
 
if __name__ == '__main__':
  main()

                                                                                   

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