threading之线程的开始,暂停和退出
背景
利用多线程实现一个开关功能,需要对产生的线程进行管理(例如:开启,暂停,关闭等操作)。
实现代码
任务脚本:
#!/usr/bin/python3
# _*_ coding: utf-8 _*_
"""
@Software: PyCharm
@File: ac_job.py
@Author: 高留柱
@E-mail: liuzhu.gao@foxmail.com
@Time: 2020/9/19 10:30 上午
@Notes: 用于开启线程,执行ac_work中的任务
"""
import threading
from utils.hfac_lib import hfac_work
class Job(threading.Thread):
def __init__(self, *args, **kwargs):
super(Job, self).__init__(*args, **kwargs)
self.__flag = threading.Event() # 用于暂停线程的标识
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识
self.__running.set() # 将running设置为True
def run(self):
while self.__running.isSet():
self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
try:
# 任务
hfac_work.start_ac()
except Exception as e:
# 如果任务失败,自动结束该线程,外层可用方法判断线程是否存活,从而判断任务是否失败。
# return 方法在线程中不能使用
self.stop()
print(e)
def pause(self):
self.__flag.clear() # 设置为False, 让线程阻塞
def resume(self):
self.__flag.set() # 设置为True, 让线程停止阻塞
def stop(self):
self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
self.__running.clear() # 设置为False
调用脚本:
方法:
- job.start() 启动线程
- job.stop() 停止线程
- job.pause() 暂停线程
- job.resume() 恢复线程
- job.is_alive() 判断线程是否存活
无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.
因此,在主进程中停止线程的任务,在使用is_alive()方法之前最好加上个time.sleep(),防止线程滞后,导致is_alive()方法失败
def post(self, request, *args, **kwargs):
"""
开始和停止测试(控制电源硬件)
:param request:
:param args:
:param kwargs:
:return:
"""
global job, is_start
is_run = request.POST.get("is_run")
if not job:
job = ac_job.Job()
if is_run == "1":
if not is_start:
job.start()
# 此处time.sleep一会儿,如果线程中出现异常会调用self.stop,延迟一会儿,方便线程终止后判断是否存活线程
# 如果不延迟一会儿,主进程检测是否存活的时候,线程还没死掉
time.sleep(3)
if not job.is_alive():
return APIResponse(1, "程序开始失败,请检查电源的com口是否异常!", result="")
is_start = True
return APIResponse(msg="开始测试!", result="")
return APIResponse(1, "程序已经在测试中,需要先停止!", result="")
else:
if is_start:
job.stop()
job = None
is_start = False
return APIResponse(msg="测试已停止!", result="")
return APIResponse(1, "程序没有在测试中,无法停止!", result="")
threading之线程的开始,暂停和退出的更多相关文章
- python-线程的暂停, 恢复, 退出
我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...
- python使用threading获取线程函数返回值的实现方法
python使用threading获取线程函数返回值的实现方法 这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下 threading用于提供线程相 ...
- Java线程监听,意外退出线程后自动重启
Java线程监听,意外退出线程后自动重启 某日,天朗气清,回公司,未到9点,刷微博,顿觉问题泛滥,惊恐万分! 前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博 ...
- (Java学习笔记) Java Threading (Java线程)
Java Threading (Java线程) ● Process & Thread Processes are the abstraction of running programs: A ...
- Unity3d监听手机暂停与退出事件
做移动互联网类型的开放,很多情况得考虑移动设备的暂停与退出时,做某些数据操作或UI. 1,退出事件,Unity3d,InPut就包含了: Input.GetKey(KeyCode.Escape) . ...
- threading:线程创建、启动、睡眠、退出
1.方法一:将要执行的函数作为参数传递给threading.Thread() import threading import time def func(n): global count time.s ...
- [Python]threading local 线程局部变量小測试
概念 有个概念叫做线程局部变量.一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理.可是有些变量初始化以后.我们仅仅想让他们在每一个 ...
- MFC 线程启动、暂停、继续、终止
CWinThread* p_myThread;//创建线程指针 BOOL flag_myThread = FALSE;//是否终止 //头文件中声明(放类内) static UINT MyThread ...
- threading 官方 线程对象和锁对象以及条件对象condition
官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...
随机推荐
- C++开发时字符编码的选择
最近看了很多有关字符编码的讨论帖子, 自己也做了很多尝试, 针对linux和windows上字符编码的选择做了个简单整理, 在此做个记录 首先是基础编码知识, 下面我列出的4个编码方式或字符集是我们应 ...
- Jmeter 常用函数(6)- 详解 __P
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 和 __property 作用一样,不 ...
- springmvc中get和post区别和应用
最近对post和get什么时候使用 和 应该怎么使用 他俩的区别 有了一些疑问 根据本人的了解 post是对数据进行了封装保护 get是安全性较差的 可以看到数据的信息 post是用来改 ...
- Linux查看系统硬件信息命令汇总
对工作中,经常用的查看系统硬件命令的一个简单总结 1.查看磁盘类型(是否SSD盘)cat /sys/block/sda/queue/rotational注意:命令中的sba是你的磁盘名称,可以通过df ...
- 算法-排序(1)k路平衡归并与败者树
const int MaxValue=; //根据实际情况选择最大值 void kwaymerge(Element *r,int k){ int i,q; r=new Element[k]; //在败 ...
- Erlang中的宏定义应该在什么时候用
读<Erlang OTP并发编程实战>中看到这么一句话,遂做笔记以记录: 宏不是函数的替代品,当你所需的抽象无法用普通函数来实现时,宏给出了一条生路,比如,必须确保在编译期展开某些代码的时 ...
- 哇,ElasticSearch多字段权重排序居然可以这么玩
背景 读者提问:ES 的权重排序有没有示列,参考参考? 刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下. 在很多复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求.不过 ...
- rbac表 ( 5张 )
/* Navicat Premium Data Transfer Source Server : 本地连接 Source Server Type : MySQL Source Server Versi ...
- 分分钟玩转UI自动化测试
有没有那么一刻,看到自动模拟用户操作界面感觉好神奇. 关于什么叫 UI 自动化测试就不解释了,基本上是你刚才脑海里想到什么就是什么. 在分层自动化测试中包括:UI 测试.集成/接口测试.单元测试.大神 ...
- 《MySQL数据库》MySQL主从复制搭建与原理
前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...