2010-07-31 5 views

Répondre

0

Je ne connais pas votre besoin exact, mais il se pourrait que vous soyez intéressé par ce code que j'ai posté dans la discussion DaniWeb sur la priorité de la file d'attente. La liste est facile d'enregistrer une copie par tranchage etc.

#Python 2.6.5 
from random import randint 
class Priority: 
    def __init__(self,prioritylevels=5): 
     """The constructor builds list for priority queue which would be used later 
     """ 
     self.prioritylevels = prioritylevels 
     self.pq = [[] for priority in range(self.prioritylevels)] # prioritylevels 

    def add_to_queue(self, data, priority=None): 
     """Add every received in data and use priority parameter or 
     its priority key to get its priority value (1 == highest) in the global queue 
     """ 
     if priority is None: priority = data['priority']-1 
     else: priority -= 1 

     if 0 <= priority < self.prioritylevels: 
      self.pq[priority].append(data) 
     else: raise ValueError,"Priority level out of bounds: %s" % priority 

    def get(self): 
     """ get lowest priority values first from queue """ 
     for priorityevents in self.pq: 
      while priorityevents: 
       yield priorityevents.pop(0) ## use list as queue to keep insertion order (remove from front)    
    def num_items(self): 
     return sum(len(q) for q in self.pq) 


if __name__ == '__main__': 

    myqueue = Priority(8) 
    for i in range(100000): 
     item=randint(0,234234) 
     if not i % 10000: print i, 
     priority=(item & 0b111) +1 ## lets three lowest bits decide which priority we give 
     myqueue.add_to_queue(('Number',item),priority=priority) 

    print "\n%i items in queues" % myqueue.num_items() 
    print "Items by priorities" 
    print '\n'.join("%i: %i" % (priority+1,len(q)) for priority, q in enumerate(myqueue.pq)) 
    print "\nGetting items out of queue in priority order:" 
    priority=0 
    for description,i in myqueue.get(): 
     assert (i & 0b111 >= priority), '** Bug ***' ## validity test priority must be same or lower for items 
     priority = i & 0b111 
    # empty after get 
    print "Finished" 
    print "%i items in queue" % myqueue.num_items() 
10

Le queue module en Python est utilisé pour synchroniser des données partagées entre les threads. C'est pas conçu comme une structure de données et il ne supporte pas la copie (même pas la copie superficielle).

(Il est possible de construire de nombreuses années deepcopy d'une file d'attente par .get et .put, mais l'original File d'attente sera détruite.)

Si vous voulez avoir une file d'attente (ou pile) en tant que structure de données, use a collections.deque . Si vous voulez une file d'attente prioritaire, utilisez le heapq module. Le deque prend en charge la copie profonde. heapq est soutenu par une liste, donc deepcopy est également supporté.

Questions connexes