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

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

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

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

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

问题描述:

前几天写一个项目,然后项目中有一个死循环的线程,我需要让他在我需要的时候直接停止该线程,但是使用基本方法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 停止死循环的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python3如何使用多线程升程序运行速度

    优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from threading import Thread, Lock import datetime base_url = "http://git.xx.com" project_members_commits_lang_info = {} lock = Lock() threads = [] ''' Author:zenkilan '

  • Python 多线程C段扫描、检测 Ping扫描脚本的实现

    我就废话不多说了,大家还是直接看代码吧~ import subprocess as p import time import threading from queue import Queue def check_ip(ip): w=p.Popen('ping -n 2 '+ip,shell=True,stdout=p.PIPE,stderr=p.PIPE,encoding='gbk') result=w.stdout.read() # print(result) if 'TTL' in res

  • python使用多线程查询数据库的实现示例

    一.背景: 当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返回结果,在这个过程中cpu无疑是处于等待io的空闲状态的,这样既浪费了cpu资源,又花费了大量时间(当然这里主要说多线程,批量查询不在考虑范围,总会存在不能批量查询的情况),在这种非密集型运算(及大量占用cpu资源)的情况下在python中无疑运用多线程是一个非常棒的选择. 二.知识点: 数据库连接池的运用及优势,python中多线程的运用,队列的运用 数据库连接池:限制了数据库的连接最大个数,每次连接都是可以重复使用的,

  • python 多线程死锁问题的解决方案

    死锁的原理非常简单,用一句话就可以描述完.就是当多线程访问多个锁的时候,不同的锁被不同的线程持有,它们都在等待其他线程释放出锁来,于是便陷入了永久等待.比如A线程持有1号锁,等待2号锁,B线程持有2号锁等待1号锁,那么它们永远也等不到执行的那天,这种情况就叫做死锁. 关于死锁有一个著名的问题叫做哲学家就餐问题,有5个哲学家围坐在一起,他们每个人需要拿到两个叉子才可以吃饭.如果他们同时拿起自己左手边的叉子,那么就会永远等待右手边的叉子释放出来.这样就陷入了永久等待,于是这些哲学家都会饿死. 这是一

  • Python高并发和多线程有什么关系

    "高并发和多线程"总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程 多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现. 高并发是一种系统运行过程中遇到的一种"短时间内遇到大量操作请求"的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况:天猫双十一活动). 该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等.如果高并发处理

  • Python 多进程、多线程效率对比

    Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 GIL 这把大锁的存在,导致执行计算密集型任务时多线程实际只能是单线程.而且由于线程之间切换的开销导致多线程往往比实际的单线程还要慢,所以在 python 中计算密集型任务通常使用多进程,因为各个进程有各自独立的 GIL,互不干扰. 而在 IO 密集型任务中,CPU 时常处于等待状态,操作系统需要

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

    进程想要执行任务就需要依赖线程.换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程. 那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程. 所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的. 并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上

  • 用Python实现一个简单的线程池

    线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因. 我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列.整个执行过程其实就是使

  • Python 如何创建一个线程池

    问题 你创建一个工作者线程池,用来响应客户端请求或执行其他的工作. 解决方案 concurrent.futures 函数库有一个 ThreadPoolExecutor 类可以被用来完成这个任务. 下面是一个简单的TCP服务器,使用了一个线程池来响应客户端: from socket import AF_INET, SOCK_STREAM, socket from concurrent.futures import ThreadPoolExecutor def echo_client(sock, c

  • Python快速实现一个线程池的示例代码

    目录 楔子 Future 对象 提交函数自动创建 Future 对象 future.set_result 到底干了什么事情 提交多个函数 使用 map 来提交多个函数 按照顺序等待执行 取消一个函数的执行 函数执行时出现异常 等待所有函数执行完毕 小结 楔子 当有多个 IO 密集型的任务要被处理时,我们自然而然会想到多线程.但如果任务非常多,我们不可能每一个任务都启动一个线程去处理,这个时候最好的办法就是实现一个线程池,至于池子里面的线程数量可以根据业务场景进行设置. 比如我们实现一个有 10

  • Python实现对一个函数应用多个装饰器的方法示例

    本文实例讲述了Python实现对一个函数应用多个装饰器的方法.分享给大家供大家参考,具体如下: 下面的例子展示了对一个函数应用多个装饰器,可以加多个断点,在debug模式下,查看程序的运行轨迹... #!/usr/bin/env python #coding:utf-8 def decorator1(func): def wrapper(): print 'hello python 之前' func() return wrapper def decorator2(func): def wrapp

  • 在PyCharm中实现关闭一个死循环程序的方法

    由于刚刚学习python,对PyCharm也不是很熟悉,在成功运行多个死循环程序而没有关闭它的情况下,PyCharm成功的经常无响应,反应缓慢,一度怀疑是电脑出问题了,经过多次试验,嗯,不是电脑的问题. 接下来就详细说明如何关闭死循环程序: 第一步: (注意看死循环程序和正常运行的程序的区别) 第二步: (鼠标左键单击选择要关闭的死循环程序,然后单击右键选择红色框位置的选项,左键点击) 第三步: (点击后出现下图,然后左键点击红色框位置选项) 第四步: (检查是否已经删除,现在只剩下正常运行的程

  • 使用Python来做一个屏幕录制工具的操作代码

    一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位.以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到python也能实现.那就赶紧学习下. 二.效果展示 三.知识串讲 这次要讲的东西可能比较多了,涉及到pyqt5 GUI软件的制作.QThread多线程的使用.Sikuli库的图形操作.win32库的模拟键盘操作.cv2库的写视频文件等.下面我们一点点来蚕食我这次写的代码. 1.GUI界面制作 这次我用的是现成的Pyqt5界面布局类,QVBox

  • Python中使用threading.Event协调线程的运行详解

    threading.Event机制类似于一个线程向其它多个线程发号施令的模式,其它线程都会持有一个threading.Event的对象,这些线程都会等待这个事件的"发生",如果此事件一直不发生,那么这些线程将会阻塞,直至事件的"发生". 对此,我们可以考虑一种应用场景(仅仅作为说明),例如,我们有多个线程从Redis队列中读取数据来处理,这些线程都要尝试去连接Redis的服务,一般情况下,如果Redis连接不成功,在各个线程的代码中,都会去尝试重新连接. 如果我们想

  • python如何停止递归

    首先,在递归函数之外定义一个全局变量:isGo,布尔型,初始值为真,意思是可以继续循环. 接着,在递归循环的一开始就设置判断机制,一旦isGo的值为假,就层层阻止,直到退出所有层的循环,从而达到强制退出递归的目的. if(isGo==false){ return } 最后,在递归的"满足条件"代码中增加如下语句: isGo =false; 下面给出修改后的代码: var isGo:Boolean=true functionarr_all(pre:Array,nex:Array) { i

  • 使用python tkinter开发一个爬取B站直播弹幕工具的实现代码

    项目地址 https://github.com/jonssonyan... 开发工具 python 3.7.9 pycharm 2019.3.5 代码 import threading import time import tkinter.simpledialog from tkinter import END, simpledialog, messagebox import requests class Danmu(): def __init__(self, room_id): # 弹幕url

随机推荐