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 28 Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
python基于socket实现网络广播的方法
Apr 29 Python
Python去除字符串两端空格的方法
May 21 Python
python3实现多线程聊天室
Dec 12 Python
pandas DataFrame 删除重复的行的实现方法
Jan 29 Python
Python下简易的单例模式详解
Apr 08 Python
python英语单词测试小程序代码实例
Sep 09 Python
python列表推导式入门学习解析
Dec 02 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
python boto和boto3操作bucket的示例
Oct 30 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新手上路(四)
2006/10/09 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
使用Python编写vim插件的简单示例
2015/04/17 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
python 自动批量打开网页的示例
2019/02/21 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python实现飞船大战
2020/04/24 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
暑期研修感言
2014/02/17 职场文书
年会搞笑主持词
2014/03/27 职场文书
离婚财产分配协议书
2014/10/21 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
青春雷锋观后感
2015/06/10 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
Python实现自动玩连连看的脚本分享
2022/04/04 Python
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android