美文网首页
python snippets

python snippets

作者: wangrui927 | 来源:发表于2018-04-02 10:00 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/qdjthftx.html