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 sort、sorted高级排序技巧
Nov 21 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
使用python遍历指定城市的一周气温
Mar 31 Python
python根据txt文本批量创建文件夹
Dec 08 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
Python实现分数序列求和
Feb 25 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
python 三种方法提取pdf中的图片
Feb 07 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查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
总结对比php中的多种序列化
2016/08/28 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
Angular实现form自动布局
2016/01/28 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
Python多线程编程简单介绍
2015/04/13 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python正则表达式的使用
2017/06/12 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
Django实现文件上传和下载功能
2019/10/06 Python
python TCP包注入方式
2020/05/05 Python
Python如何输出警告信息
2020/07/30 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
开业庆典邀请函
2014/01/08 职场文书
国窖1573广告词
2014/03/21 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
党章培训心得体会
2014/09/04 职场文书
农村文化建设标语
2014/10/07 职场文书
检察院起诉书
2015/05/20 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
导游词之西安骊山
2019/12/20 职场文书