跟同事聊起了delayqueue的实现delayqueue是啥? 听着名字就知道是延迟队列,也可以理解为是基于时间的定时任务队列. 

delayqueue又有什么用处? 
比如你维护了一个连接池,但是因为各种原因,你需要把这一堆的链接超过5分钟的长连接给干掉,重新创建个新的,然后塞入队列里面…
比如你维护了cache server,你又不想去被动更新缓存,而是想主动更新cache的内容,这时候,你怎么知道哪些缓存的key过期了,需要重新从hbase里面scan,然后塞入到cache里面。 

delayqueue要实现的东西其实挺多的,咱们可以变相的实现一个定时器 timer…  也就是让系统定时的去执行某个任务… … 

文章的原文地址,http://xiaorui.cc/?p=1721
先说一个坑… 在stackoverflow看到一个运行的demo,啥都没想就跑了….. 

import time
import threading

def hello(s):
    print s

key = “xiaorui.cc”

for i in range(3):
    t = threading.Timer(3.0, hello(key,))
    t.start()

Exception in thread Thread-3:
Traceback (most recent call last):
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 810, in __bootstrap_inner
    self.run()
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 1082, in run
    self.function(*self.args, **self.kwargs)
TypeError: ‘NoneType’ object is not callable

Exception in thread Thread-1:
Traceback (most recent call last):
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 810, in __bootstrap_inner
    self.run()
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 1082, in run
    self.function(*self.args, **self.kwargs)
TypeError: ‘NoneType’ object is not callable

Exception in thread Thread-2:
Traceback (most recent call last):
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 810, in __bootstrap_inner
    self.run()
  File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”, line 1082, in run
    self.function(*self.args, **self.kwargs)
TypeError: ‘NoneType’ object is not callable

这是能跑起来的代码….   还是看threading的timer源码才发现的.

[ruifengyun@devops delay ]$ python b.py
xiaorui.cc
xiaorui.cc
xiaorui.cc

下面是Timer的源码实现,实现的方式很简单,收到一个任务后,我立即new一个线程,线程逻辑里面最前面插入sleep…  等你时间消耗没了,你需要运行的函数自然而然也就执行了。 

我这边又简单加了一层装饰器,这样能方便的让实时的任务改成定时器去执行…   先前说了,python threading timer的实现有些丑陋.. 应该说是太简单了
每个任务都new一个线程,线程一多,cpu的上下文切换也是个成本…   切记,如果你的任务太多,一定更不要用Timer…. 

总结:
    python这个timer定时器太简单了….  也就可以简单的一用…



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品