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中使用dict和set方法的教程
Apr 27 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
Python实现进程同步和通信的方法
Jan 02 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
python list转矩阵的实例讲解
Aug 04 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 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
php文件怎么打开 如何执行php文件
2011/12/21 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
详解js异步文件加载器
2016/01/24 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
python妙用之编码的转换详解
2017/04/21 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
Python利用folium实现地图可视化
2021/05/23 Python
Python 视频画质增强
2022/04/28 Python