由于协程没办法完成(一)中所说的任务模式

接下来就尝试一下使用线程和队列来实现一下这个功能

在实现之前,我们先明确一个问题——python的线程是伪并发的。同一时间只能有一个线程在运行。具体怎样的运作方式由解释器决定

然后回顾一下上一章遇到的问题——return以后,需要另外一个线程去检测之前的操作是否执行成功

因此程序的流程设计应该是这样的:

 # 大致流程步骤如下
# 1.获取参数(接口被访问时触发)
request_data = request.form
# 2.根据参数查询内容
target = Target.query.filter_by(id=request_data).first()
# 3.将结果插入队列
ans_queue.put(target)
# 4.激活线程
thread.set()
# 5.将结果从队列中取出
ans_queue.get()
# 6.处理结果
check()
# 7.将线程休眠(阻塞)
thread.event.clear()

这样设计的考虑主要是以下几点:

1.简单

2.入队可以保证消息按时间顺序被处理

3.出队可以保证当队列不为空时,检查线程会执行到队列为空为止。免去不必要的唤醒检查。然后在有消息入队时被重新激活

4.其实我们的设计正常来说不会出现3中的检查情况。基本上队列一旦有消息入队,线程就会启动并清空队列

5.入队可以保证消息的完整和独立性,每次请求得到的数据入队后,队列中都是一列数组。处理逻辑更清晰

6.队列中的数据不出栈是不可见的

7.我就是宁愿用全局队列也不想用全局变量

实际接口代码和线程代码如下:

A.队列和线程代码

 # 消息队列
lock_queue = Queue() def check_kill(event):
while True:
# check queue
if lock_queue.empty() is True:
event.clear()
# wait event
if event.is_set() is not True:
event.wait()
# do some work
sids, serials, minutes, hosts, insts, opasses, ospasses = [], [], [], [], [], [], [] # get data until queue empty or datas more than 10
if lock_queue.empty() is not True:
data = lock_queue.get()
for i in data:
sid, serial, minute, host, inst, opass, ospass = i.split(',')
sids.append(sid)
serials.append(serial)
minutes.append(minute)
hosts.append(host)
insts.append(inst)
opasses.append(opass)
ospasses.append(ospass) # init the command
kill_command = 'kill -9' # each time we deal less or equal 10 check
for i in range(len(minutes)):
current = datetime.datetime.now().minute
if current >= int(minutes[i]):
passtime = current - int(minutes[i])
else:
passtime = current + 60 - int(minutes[i]) print("passtime is", passtime)
if (5 - passtime) >= 0:
time.sleep((5 - passtime)*60) # split piece of list
sql_sids, sids = sids[0], sids[1:]
sql_serials, serials = serials[0], serials[1:]
sql_hosts, hosts = hosts[0], hosts[1:]
sql_insts, insts = insts[0], insts[1:]
sql_opass, opasses = opasses[0], opasses[1:]
sql_ospass, ospasses = ospasses[0], ospasses[1:] print("data", sql_hosts, sql_insts, sql_serials, sql_sids)
# create cursor try:
conn = sqlite3.connect('data-dev.sqlite')
c = conn.cursor()
cu = c.execute("select ouser,oport,osport,osuser from tool_target where host='%s' and inst='%s'" % (sql_hosts, sql_insts)) result = cu.fetchall() ouser = result[0][0]
opass = sql_opass
str_conn = (sql_hosts
+ ':'
+ str(result[0][1])
+ '/'
+ sql_insts)
odb = cx_Oracle.connect(ouser, opass, str_conn)
cursor = odb.cursor() # select to find if lock exist
sql = '''select b.spid, a.sid, a.serial#, a.event from v$session a, v$process b
where a.sid = %s and a.serial# = %s ''' % (sql_sids, sql_serials) cursor.execute(sql)
answer = cursor.fetchall()
print("answer is", answer)
kill_command += ' ' + answer[0][0] s = paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(sql_hosts, result[0][2], result[0][3], sql_ospass)
stdin, stdout, stderr = s.exec_command(kill_command)
stdout.read()
print('------------------------')
s.close()
cursor.close()
odb.close()
c.close()
conn.close()
except:
pass txkill_ready = threading.Event()
t1 = threading.Thread(target=check_kill, args=(txkill_ready,), name='t1')
t1.start()
# txkill_ready.set()

B.接口代码

 @main.route('/txlock/startkillurl', methods=['POST'])
def start_kill_url():
if request.method == 'POST':
cmd = request.form.getlist('list')[0]
host = request.form.getlist('host')[0]
inst = request.form.getlist('inst')[0]
# print(len(cmd))
# cmd.replace("\n", "")
# cmd.replace("\t", "")
# print(len(cmd)) tooltarget = ToolTarget.query.filter_by(host=host, inst=inst).first()
ouser = tooltarget.ouser
opass = ToolTarget.de_rsa(pwd=tooltarget.opass)
ospass = ToolTarget.de_rsa(pwd=tooltarget.ospass)
str_conn = (tooltarget.host
+ ':'
+ str(tooltarget.oport)
+ '/'
+ tooltarget.inst)
odb = cx_Oracle.connect(ouser, opass, str_conn)
cursor = odb.cursor() # add into queue
c = re.findall('\d*,\d*', cmd)
d = [i+','+str(datetime.datetime.now().minute)+','+host+','+inst+','+opass+','+ospass for i in c]
# data example : ['15,5,17', '16,23,17', '14,5,17', '142,1,17']
lock_queue.put(d)
txkill_ready.set() try:
cursor.execute(cmd)
# pass
except:
return "执行失败,关闭弹窗后会自动刷新列表"
return "执行成功,关闭弹窗后会自动刷新列表"

后台程序处理(二) python threading - queue 模块使用的更多相关文章

  1. python threading queue模块中join setDaemon及task_done的使用方法及示例

    threading:     t.setDaemon(True)  将线程设置成守护线程,主进行结束后,此线程也会被强制结束.如果线程没有设置此值,则主线程执行完毕后还会等待此线程执行.     t. ...

  2. Python队列queue模块

    Python中queue模块常用来处理队列相关问题 队列常用于生产者消费者模型,主要功能为提高效率和程序解耦 1. queue模块的基本使用和相关说明 # -*- coding:utf-8 -*- # ...

  3. Python中Queue模块及多线程使用

    Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...

  4. Python之Queue模块

    Queue 1.创建一个“队列”对象 >>> import Queue >>> queue = Queue.Queue(maxsize=100) >>& ...

  5. 二. python函数与模块

    第四章.内置函数与装饰器详解 1.内置函数补充1 注:红色圆圈:必会:  紫红色方框:熟练:   绿色:了解 callable() 判断函数是否可以被调用执行 def f1(): pass f1() ...

  6. Python之queue模块以及生产消费者模型

    队列 队列类似于一条管道,元素先进先出,进put(arg),取get() 有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态. 队列分类 队列有很多中,但都依赖 ...

  7. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

  8. python-网络安全编程第六天(threading多线程模块&Queue模块&subprocess模块)

    前言 昨天晚上9点多就睡了 2点起来没睡意... 那就学习吧emmmm ,拿起闲置几天的python课程学习.学习到现在5.58了 总结下 继续开始学习新的内容 多多线程? 线程(英语:thread) ...

  9. 【Python@Thread】queue模块-生产者消费者问题

    python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...

随机推荐

  1. C语言函数与程序结构

    title : C语言函数与程序结构 tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义 grammar_cjkRuby: true --- 外部变量 变量声明用于说明变量 ...

  2. Mysql 用法

    一转眼,一个星期过去了,来到测试班也一个星期了,今天经历了一次,这是自己这一周的总结,也算对自己这一周的一个交代. 几个比较重要的语句: 查看数据库 show databases; 创建数据库 cre ...

  3. 激光相机数据融合(5)--Gazebo仿真数据融合

    这一节将用ROS+Gazebo 环境获取激光获取点云,并用PCL和OPENCV处理,源代码在:https://github.com/ZouCheng321/5_laser_camera_sim 由于激 ...

  4. Shodan在渗透测试及漏洞挖掘中的一些用法

    渗透测试中,第一阶段就是信息搜集,这一阶段完成的如何决定了你之后的进行是否顺利,是否更容易.而关于信息收集的文章网上也是有太多.今天我们来通过一些例子来讲解如何正确使用Shodan这一利器. 想要利用 ...

  5. 为什么大家觉得自学HTML5难?

    互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...

  6. wex5 设置文本居中或图片居中

    wex5 设置文本居中  text-align:center就好了,display要设置成block  或图片居中   设置class属性的居中

  7. mysql安装后服务启动不了(总结)

    mysql安装后服务启动不了 1.1 前言 最近真的是倒霉到家,装个mysql都能把所有的问题给问候了一遍······不过这也是一个宝贵的经验,得好好总结下,毕竟也不知道以后会不会再次遇到.如果有网友 ...

  8. [C#]使用Gembox.SpreadSheet向Excel写入数据及图表

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  9. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  10. 分享一些JAVA相关资源

    前言 以前在学习JAVA时,因为搜索相关资源过于不便,所以在搜集了一些好用的资源之后,将此分享. 文档主要包括面试文档, JAVA的技术文档(如JAVA并发实战.设计模式之类),LINUX的相关文档以 ...