python线程优先级队列知识点总结
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
importqueue
importthreading
importtime
exitFlag=0
classmyThread(threading.Thread):
def__init__(self,threadID,name,q):
threading.Thread.__init__(self)
self.threadID=threadID
self.name=name
self.q=q
defrun(self):
print("开启线程:"+self.name)
process_data(self.name,self.q)
print("退出线程:"+self.name)
defprocess_data(threadName,q):
whilenotexitFlag:
queueLock.acquire()
ifnotworkQueue.empty():
data=q.get()
queueLock.release()
print("%sprocessing%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
#创建新线程
fortNameinthreadList:
thread=myThread(threadID,tName,workQueue)
thread.start()
threads.append(thread)
threadID+=1
#填充队列
queueLock.acquire()
forwordinnameList:
workQueue.put(word)
queueLock.release()
#等待队列清空
whilenotworkQueue.empty():
pass
#通知线程是时候退出
exitFlag=1
#等待所有线程完成
fortinthreads:
t.join()
print("退出主线程")
知识点扩展:
问题
怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素
解决方案
下面的类利用heapq模块实现了一个简单的优先级队列:
importheapq classPriorityQueue: def__init__(self): self._queue=[] self._index=0 defpush(self,item,priority): heapq.heappush(self._queue,(-priority,self._index,item)) self._index+=1 defpop(self): returnheapq.heappop(self._queue)[-1]
下面是它的使用方式:
>>>classItem:
...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线程优先级队列有哪些内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。