背景

利用多线程实现一个开关功能,需要对产生的线程进行管理(例如:开启,暂停,关闭等操作)。

实现代码

任务脚本:

#!/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之线程的开始,暂停和退出的更多相关文章

  1. python-线程的暂停, 恢复, 退出

    我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...

  2. python使用threading获取线程函数返回值的实现方法

    python使用threading获取线程函数返回值的实现方法 这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下 threading用于提供线程相 ...

  3. Java线程监听,意外退出线程后自动重启

    Java线程监听,意外退出线程后自动重启 某日,天朗气清,回公司,未到9点,刷微博,顿觉问题泛滥,惊恐万分! 前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博 ...

  4. (Java学习笔记) Java Threading (Java线程)

    Java Threading (Java线程) ● Process & Thread Processes are the abstraction of running programs: A ...

  5. Unity3d监听手机暂停与退出事件

    做移动互联网类型的开放,很多情况得考虑移动设备的暂停与退出时,做某些数据操作或UI. 1,退出事件,Unity3d,InPut就包含了: Input.GetKey(KeyCode.Escape) .  ...

  6. threading:线程创建、启动、睡眠、退出

    1.方法一:将要执行的函数作为参数传递给threading.Thread() import threading import time def func(n): global count time.s ...

  7. [Python]threading local 线程局部变量小測试

    概念 有个概念叫做线程局部变量.一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理.可是有些变量初始化以后.我们仅仅想让他们在每一个 ...

  8. MFC 线程启动、暂停、继续、终止

    CWinThread* p_myThread;//创建线程指针 BOOL flag_myThread = FALSE;//是否终止 //头文件中声明(放类内) static UINT MyThread ...

  9. threading 官方 线程对象和锁对象以及条件对象condition

    官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...

随机推荐

  1. Oracle数据库安装教程

    一.准备文件 Oracle安装程序(64位)下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_ ...

  2. 聊一聊mycat数据库集群系列之双主双重实现

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...

  3. QT+VS环境配置中遇到的问题

    大体流程参考的别人的博客流程如下: QT安装: https://blog.csdn.net/qq_42907800/article/details/107370967?> QT+VS环境配置 h ...

  4. markdown使用手册

    github上找到了一个挺全面的项目,mark一下. https://github.com/nicejade/nice-front-end-tutorial/blob/master/tutorial/ ...

  5. redis 过期策略你知道多少,看完文章你会不自觉说喔哦

    Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除.你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割. 你还可以进一步站在死神的角度 ...

  6. Lua语言15分钟快速入门

    转载自: https://blog.csdn.net/qq_15437667/article/details/75042526 -- 单行注释 --[[ [多行注释] --]] ---------- ...

  7. 温故知新——Spring AOP

    Spring AOP 面向切面编程,相信大家都不陌生,它和Spring IOC是Spring赖以成名的两个最基础的功能.在咱们平时的工作中,使用IOC的场景比较多,像咱们平时使用的@Controlle ...

  8. CF1203D2 Remove the Substring (hard version) 题解

    这题初赛让我白给了6分,于是我决定回来解决一下它. 说实话,看原题题面和看CCF代码真是两种完全不同的感受…… ------------思路分析: 把$s$串删去一部分之后,会把$s$串分成两部分,当 ...

  9. JavaScript函数的高级用法

    1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = functi ...

  10. win环境下安装配置openCV-4.3.0

    win环境下安装openCV-4.3.0 首先下载 推荐国内镜像 官网太太太慢了 附上 下载地址 下载之后打开exe解压到目录都是常规操作 环境变量的配置 依次打开到系统变量的path 新建一个路径为 ...