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处理中文编码和判断编码示例
Feb 26 Python
wxpython中利用线程防止假死的实现方法
Aug 11 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
全面了解python中的类,对象,方法,属性
Sep 11 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
十分钟利用Python制作属于你自己的个性logo
May 07 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
Django 解决由save方法引发的错误
May 21 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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防CC攻击实现代码
2011/12/29 PHP
php中opendir函数用法实例
2014/11/15 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
vscode 远程调试python的方法
2017/12/01 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Django中使用Celery的方法示例
2018/11/29 Python
Django框架验证码用法实例分析
2019/05/10 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
python打印异常信息的两种实现方式
2019/12/24 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
英语求职信范文
2014/05/23 职场文书
社区禁毒工作方案
2014/06/02 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
公司租房协议书
2014/10/14 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android