Delayqueue (python 实现)

原创 2015年07月07日 13:24:51

起因:几年前为了开发一个监控系统,需要周期性的对系统状态进行检查,因此需要对检查任务进行添加,排队(按时间),移除等操作,无意中发现java jdk 中有DelayQueue,因此实现了一个python版本

源码如下:

# -*- coding:utf-8 -*-
# python 版的 DelayQueue 类 和 Delayed 接口 
# 
from Queue import PriorityQueue
from datetime import datetime
import threading

class Delayed(object):
    # 返回:计划执行时间
    # 单位: datetime
    def plan_time(self):
        pass

def total_seconds(td):
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6


class 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)

Java通过DelayQueue的实现多线程任务的阻塞队列

DelayQueue 1)java.util.concurrent.DelayQueue 延迟阻塞队列,是一个有序的无界阻塞队列,只有在延迟期满时才能从中提取元素,该队列的头部为 延迟期满 ...
  • Al_assad
  • Al_assad
  • 2016年11月01日 09:13
  • 1777

DelayQueue延时队列的使用

在谈到DelayQueue的使用和原理的时候,我们首先介绍一下DelayQueue,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的De...
  • gongzi2311
  • gongzi2311
  • 2014年10月23日 15:12
  • 4659

Redis和DelayQueue设计具有过期时间的缓存

有一款APP,用户登陆后。会将用户的用户号,手机号、以及设备号等上报给后台的清洗程序(这里设备号是唯一的)。后台因为需要根据这三个做一定的运算。所以希望对于每一个访客-用户关系进行缓存,并只缓存10分...
  • Evankaka
  • Evankaka
  • 2017年02月27日 11:19
  • 1899

使用DelayQueue 和 FutureTask 实现java中的缓存

使用DelayQueue、ConcurrentHashMap、FutureTask实现的缓存工具类。DelayQueue 简介DelayQueue是一个支持延时获取元素的无界阻塞队列。DelayQue...
  • jijianshuai
  • jijianshuai
  • 2017年08月01日 18:11
  • 314

利用DelayQueue实现延时消息队列(简易版MQ)

1.上文 关于阻塞队列的介绍:http://blog.csdn.net/caicongyang/article/details/50649897 2.需求  延迟消息队列: 1)2个小时后...
  • Truong
  • Truong
  • 2017年06月15日 14:54
  • 259

DelayQueue实现订单的定时取消

当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种: 第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的...
  • zj972535075
  • zj972535075
  • 2017年03月26日 16:23
  • 1878

Java多线程/并发27、DelayQueue延迟队列模拟实现Session

DelayQueue延迟队列理解: 1、DelayQueue队列中的元素必须是Delayed接口的实现类,该类内部实现了getDelay()和compareTo()方法,第一个方法是比较两个任务的延...
  • soonfly
  • soonfly
  • 2017年02月28日 15:29
  • 1314

DelayQueue 实现简单的定时任务

今天听qq群里面说了一个,用户 可以自定义任务的场景,我首相想到的是 spring 定时任务,不过 想了下 这个 不够灵活而且有一定的延迟。后来想到了 DelayQueue + 线程池 的想法,自己简...
  • woshimike
  • woshimike
  • 2017年01月22日 17:01
  • 904

DelayQueue的使用以及注意事项

  • 2014年12月22日 10:14
  • 6KB
  • 下载

DelayQueue原理分析

DelayedQueue是一个用来延时处理的队列,所谓延时处理就是说可以为队列中元素设定一个过期时间,相关的操作受到这个设定时间的控制。 首先,这种队列中只能存放实现Delayed接口的对象,而此接口...
  • kobejayandy
  • kobejayandy
  • 2015年07月10日 17:49
  • 3613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delayqueue (python 实现)
举报原因:
原因补充:

(最多只允许输入30个字)