Python-线程优先级


当必须在多个线程之间安全地交换信息时,Python 标准库中的队列模块在线程编程中非常有用。该模块中的 Priority Queue 类实现了所有必需的锁定语义。

使用优先级队列,条目保持排序(使用heapq模块),并且首先检索价值最低的条目。

队列对象有以下方法来控制队列 -

  • get() - get() 从队列中删除并返回一个项目。

  • put() - put 将项目添加到队列中。

  • qsize() - qsize() 返回队列中当前的项目数。

  • empty() - 如果队列为空,则empty()返回True;否则为假。

  • full() - 如果队列已满,则 full() 返回 True;否则为假。

queue.PriorityQueue(maxsize=0)

这是优先级队列的构造函数。maxsize 是一个整数,设置可以放入队列中的项目数的上限。如果 maxsize 小于或等于 0,则队列大小是无限的。

首先检索价值最低的条目(价值最低的条目是 min(entries) 返回的条目)。条目的典型模式是以下形式的元组 -

(priority_number, data)

例子

from time import sleep
from random import random, randint
from threading import Thread
from queue import PriorityQueue

queue = PriorityQueue()

def producer(queue):
   print('Producer: Running')
   for i in range(5):

      # create item with priority
      value = random()
      priority = randint(0, 5)
      item = (priority, value)
      queue.put(item)
   # wait for all items to be processed
   queue.join()

   queue.put(None)
   print('Producer: Done')

def consumer(queue):
   print('Consumer: Running')

   while True:

      # get a unit of work
      item = queue.get()
      if item is None:
         break

      sleep(item[1])
      print(item)
      queue.task_done()
   print('Consumer: Done')

producer = Thread(target=producer, args=(queue,))
producer.start()

consumer = Thread(target=consumer, args=(queue,))
consumer.start()

producer.join()
consumer.join()

它将产生以下输出-

Producer: Running
Consumer: Running
(0, 0.15332707626852804)
(2, 0.4730737391435892)
(2, 0.8679231358257962)
(3, 0.051924220435665025)
(4, 0.23945882716108446)
Producer: Done
Consumer: Done