python snippets

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最早的数据的缓存。

你可能感兴趣的:(python snippets)