python snippets
2018-04-02 本文已影响0人
wangrui927
Ring Buffer By Python
之前工作有用到过一个叫watchdog的python脚本,其工作过程中会循环地调用llinux系统的ps命令,来查询业务程序是否存活(后来还改进了一下,业务程序存在启动但是未能正常工作的可能,还需要监听一下端口是否开启)。同时我还想让这个脚本,能监视多个程序,如果程序挂掉,除了使用subprocess模块重启外,还能有一些其他自定义的callback:比如给监控汇聚器发送一个数据包,用于数据库存储与触发警报。
其实就是一个轻量的supervisor(https://github.com/Supervisor/supervisor)。
但在如何循环监听这个地方,以我目前浅薄的知识积累,好像python并没有一个环形缓存能储存python对象。(如果用go语言有个container/ring)
于是我在google搜索了一下,找到这么一篇文章
Implementing a Ring Buffer(https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch05s19.html)研究了一下其实现过程,然后添加了个遍历的方法。代码如下
class RingBuffer:
t = int(0)
def __init__(self,size):
self.size = size
self.data = []
class _Full:
def append(self, ele):
self.data[self.cur] = ele
self.cur = (self.cur + 1) % self.size
def get(self):
return self.data[self.cur:] + self.data[:self.cur]
def traverse(self):
datalen = min(len(self.data), self.size)
show_ele = self.data[self.t]
self.t += 1
if self.t >= datalen:
self.t = int(0)
return show_ele
def append(self,ele):
self.data.append(ele)
if len(self.data) == self.size:
self.cur = 0
self.__class__ = self._Full
def get(self):
return self.data
def traverse(self):
datalen = min(len(self.data), self.size)
show_ele = self.data[self.t]
self.t += 1
if self.t >= datalen:
self.t = int(0)
return show_ele
这样就实现了一个可以定义对象存储数量,新数据会overwrite最早的数据的缓存。