python 如何停止一个死循环的线程


Posted in Python onNovember 24, 2020

进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。

那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。

所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的。

python 如何停止一个死循环的线程

并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上的,在同一时刻发生的,并行在时间上是重叠的。

python 如何停止一个死循环的线程

问题描述:

前几天写一个项目,然后项目中有一个死循环的线程,我需要让他在我需要的时候直接停止该线程,但是使用基本方法join(),效果是无效的,因此我又去了百度方法,外加国外官方文档,大概的结果就是为了保护进程,这种死循环使用原来方法是很难实现的,

整体解决方案:

创建线程函数

class myThread(threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter

  def run(self):
    print("开启线程: " + self.name)
    # 获取锁,用于线程同步
    threadLock.acquire()
    # 执行要开启的线程

    # 释放锁,开启下一个线程
    threadLock.release()

死循环函数

def Dead_circle():
  while True:
    print("死循环")

增加结束的条件

def run_go():
  num = 0
  while True:
    time.sleep(1)
    num += 1
    if num == 10:
      return False # 假设我执行10s后结束

增加新方法

def run_go():
  num = 0
  while True:
    time.sleep(1)
    num += 1
    if num == 10:
      return False

修改执行方法

def Dead_circle():
  thread1 = myThread(1, "Thread-1", 1)
  thread1.start()
  while thread1.counter:
    time.sleep(1)
    print("死循环")
  thread1.join()

修改线程类

class myThread(threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter
    self.State = True

  def run(self):
    print("开启线程: " + self.name)
    # 获取锁,用于线程同步
    threadLock.acquire()
    # 执行要开启的线程
    if not run_go():
      self.counter = False
    # 释放锁,开启下一个线程
    threadLock.release()

整体代码

import threading
import time
from tkinter import *

threadLock = threading.Lock()


class myThread(threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter
    self.State = True

  def run(self):
    print("开启线程: " + self.name)
    # 获取锁,用于线程同步
    threadLock.acquire()
    # 执行要开启的线程
    if not run_go():
      self.counter = False
    # 释放锁,开启下一个线程
    threadLock.release()


def run_go():
  num = 0
  while True:
    time.sleep(1)
    num += 1
    if num == 10:
      return False


def Dead_circle():
  thread1 = myThread(1, "Thread-1", 1)
  thread1.start()
  while thread1.counter:
    time.sleep(1)
    print("死循环")
  thread1.join()


if __name__ == '__main__':
  Dead_circle()

整体思路

原来的思路是执行线程,然后规定条件,当条件触发时,直接停止该线程,但是由于线程守护的原因,我们没办法使得一个死循环突然停止,因此,我修改了原来的思路,我让死循环函数在定义的时候去创建一个计时线程,这样我的线程就是可控的,通过查找线程中的变量,获得是否停止,这样就可以控制我的线程执行时间。

以上就是python 如何停止一个死循环的线程的详细内容,更多关于python 停止死循环的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 初始化多维数组代码
Sep 06 Python
Python中的各种装饰器详解
Apr 11 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
python如何实现视频转代码视频
Jun 17 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
pytorch中的weight-initilzation用法
Jun 24 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 #Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 #Python
Python调用Redis的示例代码
Nov 24 #Python
基于django和dropzone.js实现上传文件
Nov 24 #Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 #Python
Django web自定义通用权限控制实现方法
Nov 24 #Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 #Python
You might like
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
浅谈PHP中的
2016/04/23 PHP
php简单复制文件的方法
2016/05/09 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
document.all与WEB标准
2020/05/13 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python 字符串操作方法大全
2014/03/11 Python
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
元旦晚会感言
2014/03/12 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
Nginx配置根据url参数重定向
2022/04/11 Servers