Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

class PriorityQueue(object): 

    """A priority queue implemented using multiple internal queues (typically, 

    FIFO queues). The internal queue must implement the following methods: 

 

        * push(obj) 

        * pop() 

        * close() 

        * __len__() 

 

    The constructor receives a qfactory argument, which is a callable used to 

    instantiate a new (internal) queue when a new priority is allocated. The 

    qfactory function is called with the priority number as first and only 

    argument. 

 

    Only integer priorities should be used. Lower numbers are higher 

    priorities. 

    """ 

 

    def __init__(self, qfactory, startprios=()): 

        self.queues = {} 

        self.qfactory = qfactory 

23        for p in startprios: 

            self.queues[p] = self.qfactory(p) 

        self.curprio = min(startprios) if startprios else None 

 

    def push(self, obj, priority=0): 

        if priority not in self.queues: 

            self.queues[priority] = self.qfactory(priority) 

        q = self.queues[priority] 

        q.push(obj) # this may fail (eg. serialization error) 

        if priority < self.curprio or self.curprio is None: 

            self.curprio = priority 

 

    def pop(self): 

        if self.curprio is None: 

            return 

        q = self.queues[self.curprio] 

        m = q.pop() 

        if len(q) == 0: 

            del self.queues[self.curprio] 

            q.close() 

            prios = [p for p, q in self.queues.items() if len(q) > 0] 

            self.curprio = min(prios) if prios else None 

        return m 

 

    def close(self): 

        active = [] 

        for p, q in self.queues.items(): 

            if len(q): 

                active.append(p) 

            q.close() 

        return active 

 

    def __len__(self): 

        return sum(len(x) for x in self.queues.values()) if self.queues else 0