Delayqueue (python 实现)
来源:互联网 发布:罗克韦尔变频器软件 编辑:程序博客网 时间:2024/06/06 09:27
起因:几年前为了开发一个监控系统,需要周期性的对系统状态进行检查,因此需要对检查任务进行添加,排队(按时间),移除等操作,无意中发现java jdk 中有DelayQueue,因此实现了一个python版本
源码如下:
# -*- coding:utf-8 -*-# python 版的 DelayQueue 类 和 Delayed 接口 # from Queue import PriorityQueuefrom datetime import datetimeimport threadingclass Delayed(object): # 返回:计划执行时间 # 单位: datetime def plan_time(self): passdef total_seconds(td): return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6class DelayQueue(PriorityQueue): def __init__(self, maxsize): self.queue = [] # 如果任务没有到达执行时间,则消费者必须等待在此condition上 self.lock = threading.Lock() self.can_done = threading.Condition(self.lock) def put_task(self, task): self.put((task.plan_time, task)) # 检索并移除此队列的头部,如果此队列不存在未到期延迟的元素,则等待它 def take_task(self): self.can_done.acquire() try: task = self.peek() delta = total_seconds(task.plan_time - datetime.now()) while delta > 0: self.can_done.wait(delta) task = self.peek() delta = total_seconds(task.plan_time - datetime.now()) item = self.get() self.can_done.notify_all() return item[1] finally: self.can_done.release() def peek(self): self.not_empty.acquire() try: while not self._qsize(): self.not_empty.wait() return self.queue[0][1] finally: self.not_empty.release()
PS: python 中的 PriorityQueue基于 最小堆 算法的,添加和移除一个元素的耗时都是log2(n)
0 0
- Delayqueue (python 实现)
- DelayQueue实现延迟消息
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- delayqueue
- DelayQueue
- DelayQueue实现的Comparable接口
- DelayQueue 实现简单的定时任务
- DelayQueue实现订单的定时取消
- DelayQueue 实现延时消息队列实践
- 利用DelayQueue实现延时消息队列(简易版MQ)
- Java通过DelayQueue的实现多线程任务的阻塞队列
- Creating a noSql database, what is the best source code to look at?
- Android实现两次按下返回键退出
- 用ping方式探测网络连通性--一个小程序
- Spring Bean 的生命周期
- Struts(之一)--基本介绍
- Delayqueue (python 实现)
- Android NDK开发初步
- C语言之基本算法16—条件全排列
- Android隐藏软件盘
- 【Java】编写程序,确定一个字符串s的字符重新排列后能否变成另一个字符串t
- Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段
- XML语言讲解
- Android中弹出菜单PopupWindow的使用
- Struts框架之转发和重定向