python有序队列_【Python】:拓展Queue实现有序不重复队列

最近手头有个需求是这样的,定期检查数据库获取失败任务并且进行重启。最早想到的是添加一个生产者&&消费者队列,但是发现很多棘手的问题。

1.重启任务是调用的一个shell脚本然后在脚本中又调用python程序,所以任务完成的状态回传略纠结。

2.重启任务有多种重启方式,要根据任务的不同FailStat来判断重启方式,这样的话队列中不仅要有任务名称,还需要状态码

3.Python里的原生Queue不会进行去重,可能会导致队列中对失败任务无论重启成功与否会进行多次重跑。

在StackOverflow上看了一些文章,都是推荐拓展Queue,看了看Queue.Queue的源代码,发现果然很适合拓展:

# Override these methods to implement other queue organizations

# (e.g. stack or priority queue).

# These will only be called with appropriate locks held

# Initialize the queue representation

def _init(self, maxsize):

self.queue = deque()

def _qsize(self, len=len):

return len(self.queue)

# Put a new item in the queue

def _put(self, item):

self.queue.append(item)

# Get an item from the queue

def _get(self):

return self.queue.popleft()

So,自己通过字典来实现了一个类似链表的类,然后继承Queue.Queue并重写方法,实现了一个新的有序不重复队列:

#!/usr/bin/env python

# Filename:ordered_map_queue.py

# -*- encoding:utf-8 -*-

import sys

import Queue

class Link():

''' No repeat link '''

def __init__(self):

self.map = {}

self.tail = "head"

self.map["head"] = {"stat":0, "next":"null"}

def __contains__(self,key):

return key in self.map

def __len__(self):

return len(self.map)-1

def isEmpty(self):

if self.getHead() == "null":

return True

else:

return False

def clearLink(self):

self.map.clear()

def getTail(self):

return self.tail

def getHead(self):

return self.map["head"]["next"]

def add(self, string):

# self.test_output("OrderedMapQueue")

args = string.split('\t')

item = args[0]

stat = args[1]

if item not in self.map:

self.map[item] = {"stat":stat, "next":"null"}

self.map[self.tail]["next"] = item

self.tail = item

def pop(self):

if not self.isEmpty():

head_task = self.map["head"]["next"]

rt_value = "%s\t%s" % (head_task, self.map[head_task]["stat"])

self.map["head"]["next"] = self.map[head_task]["next"]

del self.map[head_task]

if head_task == self.tail:

self.tail = "head"

return rt_value

return None

def test_output(self, name=""):

print >>sys.stderr, name

print >>sys.stderr, "-" * 10 + "TEST_OUTPUT" + "-" * 10

print >>sys.stderr, "Tail: %s\nHead: %s\nLength: %s" % (self.getTail(), self.getHead(), self.__len__())

head = "head"

while head != "null":

print >>sys.stderr, "%s\t%s\t%s" % (head, self.map[head]["stat"], self.map[head]["next"])

head = self.map[head]["next"]

print >>sys.stderr, "-" * 31

class OrderedMapQueue(Queue.Queue):

''' ordered-map queue '''

def _init(self, maxsize=0):

self.queue = Link()

def _put(self, item):

self.queue.add(item)

def _get(self):

return self.queue.pop()

def _qsize(self):

return self.queue.__len__()

if __name__ == "__main__":

#mylink = Link()

#mylink.add("task1","-1")

#mylink.add("task2","-2")

#mylink.add("task3","-1")

#mylink.test_output()

myqueue = OrderedMapQueue()

myqueue.put("task2\t-2")

myqueue.put("task3\t-1")

myqueue.put("task1\t-2")

myqueue.put("task3\t-1")

myqueue.put("task3\t-2")

myqueue.queue.test_output()

print myqueue.get()

myqueue.queue.test_output()

print myqueue.get()

myqueue.queue.test_output()

print myqueue.get()

myqueue.queue.test_output()

自己菜鸟一只,其中肯定有不少问题或者可改进的,希望大家能多多支出,我定会认真修改,多谢~

另外,推荐几个拓展Queue的连接:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab ode45求解齿轮动力学,ode45求解多自由度动力学方程实例.doc

ode45求解多自由度动力学方程实例Ode45函数调用形式如下:[T,Y]ode45(odefun,tspan,y0)相关参数介绍如下:参数名称参数说明odefun用于存放待求解的方程的m文件名,方程必须用y’f(t,y)的形式存放tspan指定自变量范围的向量,通常用[t…

onenetsim定位功能吗_微信小程序新增后台定位功能,你会卸载地图APP用微信导航吗...

[PConline]8月8日,根据微信官方发布的消息显示,小程序新增后台定位功能,并对自动化测试功能进行了升级。据介绍,为了满足线路导航、路线记录等服务场景下,小程序需要长时间持续定位来提供服务。当用户主动将小程序设置…

pdo 错误 php,多语句查询中的PHP PDO错误

我在我的一个实时网络应用程序中遇到了这个问题.看来如果你通过PHP PDO向MysqL发出一个多语句查询,并且第一个语句是一个insert语句,而第二个语句是一个update语句,那么PDO :: nextRowset()函数不会返回正确的数字结果集(请注意,自PHP 5.3起,PDO应该支持每个MySQL查询的多个语句…

hbuid 集成svn_HBuilder如何配置SVN的步骤详解

前言本文主要给大家介绍了关于HBuilder如何配置SVN的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧。注意:大家都配置前最好先备份好之前的文件资料很早之前就想在编辑器上配置SVN,但找了很多…

MATLAB静力学分析,锻造操作机静力学的Matlab仿真分析

由第3章中该新型锻造操作机的位置反解中的构件的位置以及角度的关系式,均为已知量。施加外力为Ftx50N,Fty300N和沿“轴方向的外力矩M 60000 N.mm。给定初始量范围,通过Matlab软件仿真,可以得到各个液压缸的驱动力的变化曲线。该新型锻造操作机…

babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发

对于大部分人来说,开关的布局,开关的种类都会是一脸懵。所以大家在装修的过程中就会迷茫,今天给大家分享一篇集合,相信通过这篇文章,问题会有所缓解~一,开关插座的分类1.电源开关分类:一位单控/…

php递归实现1 10阶乘,用递归实现1到100的和,1到10的阶乘

递归:方法定义中调用方法本身的现象注意实现:1.递归一定要有出口,否则就是死递归 StackOverflowError2.递归的次数不能过多,否则也会出现死递归特殊事项:构造方法不可以递归定义举例:从前有座山,山上有座庙&#xff0c…

xxljob 配置文件_最详细的xxl-job java配置方式spring-boot

转自:https://blog.csdn.net/weixin_44055234/article/details/106565516————XXL-JOB*是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。且支持线…

php怎么排除空的数组,【技术产品】php如何去除空数组

【摘要】对于初入门的php学习者肯定会有很多问题,今天考比过小编为大家整理了关于【技术产品】php如何去除空数组的信息,希望可以帮助到大家。下面就让我们一起来看下【技术产品】php如何去除空数组的具体内容吧!php如何去除空数组在php中可以…

ecs 云服务器 管理控制台_【弹性计算】教您快速学会云服务器ECS 创建命令!

云助手命令可以在ECS实例中快速完成运行自动化运维脚本、轮询进程、重置用户密码、安装或者卸载软件、更新应用以及安装补丁等一些日常任务。命令类型可以是Windows PowerShell脚本、Bat批处理命令和Linux Shell脚本,命令中支持自定义参数,方便设置变量值…

vue.js能美化界面吗_vue将单页面改造成多页面应用的方法

问题描述: 手头有一个项目是使用 vue-cli 搭建的单页面应用。项目分为了管理平台和用户查看页面,用户查看页面是很简单的页面,但是在加载过程中,却加载了整个应用的打包代码,量重且影响了响应和体验。我想要的效果是&a…

exoplayer 纯java,Exoplayer不播放任何视频

让Exoplayer工作有问题 . 我设法从网址加载视频 . 但它只播放音频 . 所以我做错了什么 .BandwidthMeter bandwidthMeter new DefaultBandwidthMeter();TrackSelection.Factory videoTrackSelectionFactory new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);TrackSel…

react 返回一个页面_React页面返回上一页时恢复原来页面的状态

需求:从一个横向纵向都有滚动条的列表页进入详情页,返回时列表页的活动条恢复到之前到位置。难点:1.列表用的是antd的table组件,滚动条是这个table组件的,浏览器返回时自身可以记录页面即document的滚动条,…

java mssql mysql,在JSP中访问MSSQLServer数据库_MySQL

SQL Server下面介绍如何用SQL Server实现一个动态FAQ(常见问题及答案)网站。首先建立一个数据库faq,其中的表faqs有字段id(int,自动增量,并设为主关键字)、subject(varchar,200)、answers(text)。这个表中可以存放一些编程知识的常…

matlab的精度变量,MatLab - 变量精度算术

永远不要假设像vpa(sin(pi / 4))这样的数字精确到完全精度,因为MATLAB通常会使用浮点运算来计算vpa调用内的数字,因此只能精确到大约16位数。但是,它似乎在这里是正确的。例如,我们知道这一点sin(pi/4) sqrt(2)/2让我们测试一下结…

直流降压的简单方法_量血压的重大误区和简单的降压方法,尽快转告身边人!...

见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故…

php oauth2 和 jwt,jwt-auth: thinkphp 的 jwt (JSON Web Token)身份验证扩展包,支持Swoole...

JWT-AUTHthinkphp的jwt(JSON Web Token)身份验证包。支持Header、Cookie、Param等多种传参方式。包含:验证、验证并且自动刷新等多种中间件。支持Swoole环境要求php > 7.0thinkphp ^5.1.10 || ^6.0.0说明目前支持如下三大类型加密方式:RSA,HASH,DSA。…

hadoop2.8配置_Hadoop2.8.2安装与配置(单机)

解压并移动到/software目录:tar -zxvf hadoop-2.8.2.tar.gzmv hadoop-2.8.2 /software/hadoop在/etc/profile文件添加:export HADOOP_HOME/software/hadoopexport HADOOP_INSTALL$HADOOP_HOMEexport HADOOP_MAPRED_HOME$HADOOP_HOMEexport HADOOP_COMMON…

编译php时的configure,PHP编译configure时常见错误

PHP的安装虽然有时候很简单,可是如果应用一多,我们安装起来就很头痛了!出错最多的就是安装PHP扩展的时候了。其实不管是你是Apache类的应用还是Nginx类的,PHP的安装都不是很简单,虽然网上有很多configure参数&#xff…

matlab热度图确定色标_C++实现类似Matlab的colormap Jet(灰度图生成彩色热度图)

Matlab使用colormap Jet 可以将灰度图像生成彩色的热度图,灰度值越高,色彩偏向暖色调。相反亦然。// ColorMap.h#ifndef COLORMAP_H#define COLORMAP_Hclass colormap{public:static void GroundColorMix(BYTE* color, double x, double min, double max…