欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python线程优先级队列知识点总结

程序员文章站 2022-03-13 09:10:10
python 的 queue 模块中提供了同步的、线程安全的队列类,包括fifo(先入先出)队列queue,lifo(后入先出)队列lifoqueue,和优先级队列 priorityqueue。1、说...

python 的 queue 模块中提供了同步的、线程安全的队列类,包括fifo(先入先出)队列queue,lifo(后入先出)队列lifoqueue,和优先级队列 priorityqueue。

1、说明

这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。

模块中的常用方法如下:

  • queue.qsize() 返回队列的大小
  • queue.empty() 如果队列为空,返回true,反之false
  • queue.full() 如果队列满了,返回true,反之false
  • queue.full 与 maxsize 大小对应
  • queue.get([block[, timeout]])获取队列,timeout等待时间
  • queue.get_nowait() 相当queue.get(false)
  • queue.put(item) 写入队列,timeout等待时间
  • queue.put_nowait(item) 相当queue.put(item, false)
  • queue.task_done() 在完成一项工作之后,queue.task_done()函数向任务已经完成的队列发送一个信号
  • queue.join() 实际上意味着等到队列为空,再执行别的操作

2、实例

#!/usr/bin/python3
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 ("开启线程:" + self.name)
    process_data(self.name, self.q)
    print ("退出线程:" + 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 ("退出主线程")

知识点扩展:

问题

怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素

解决方案

下面的类利用 heapq 模块实现了一个简单的优先级队列:

import heapq

class priorityqueue:
 def __init__(self):
 self._queue = []
 self._index = 0

 def push(self, item, priority):
 heapq.heappush(self._queue, (-priority, self._index, item))
 self._index += 1

 def pop(self):
 return heapq.heappop(self._queue)[-1]

下面是它的使用方式:

>>> class item:
... def __init__(self, name):
...  self.name = name
... def __repr__(self):
...  return 'item({!r})'.format(self.name)
...
>>> q = priorityqueue()
>>> q.push(item('foo'), 1)
>>> q.push(item('bar'), 5)
>>> q.push(item('spam'), 4)
>>> q.push(item('grok'), 1)
>>> q.pop()
item('bar')
>>> q.pop()
item('spam')
>>> q.pop()
item('foo')
>>> q.pop()
item('grok')
>>>

到此这篇关于python线程优先级队列知识点总结的文章就介绍到这了,更多相关python线程优先级队列有哪些内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: python 线程