返回顶部
首页 > 资讯 > 后端开发 > Python >python 线程的暂停, 恢复, 退出详解及实例
  • 706
分享到

python 线程的暂停, 恢复, 退出详解及实例

线程详解实例 2022-06-04 18:06:44 706人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python 线程 暂停, 恢复, 退出 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应

python 线程 暂停, 恢复, 退出

我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时.


wait([timeout])

  Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.

  阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.


  When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).

  This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.

  当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。

  此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。


  Changed in version 2.7: Previously, the method always returned None.

  2.7版本以前, 这个方法总会返回None.


  利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:


#!/usr/bin/env Python
# coding: utf-8

import threading
import time


class Job(threading.Thread):

  def __init__(self, *args, **kwargs):
    super(Job, self).__init__(*args, **kwargs)
    self.__flag = threading.Event()   # 用于暂停线程的标识
    self.__flag.set()    # 设置为True
    self.__running = threading.Event()   # 用于停止线程的标识
    self.__running.set()   # 将running设置为True

  def run(self):
    while self.__running.isSet():
      self.__flag.wait()   # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
      print time.time()
      time.sleep(1)

  def pause(self):
    self.__flag.clear()   # 设置为False, 让线程阻塞

  def resume(self):
    self.__flag.set()  # 设置为True, 让线程停止阻塞

  def stop(self):
    self.__flag.set()    # 将线程从暂停状态恢复, 如何已经暂停的话
    self.__running.clear()    # 设置为False  

下面是测试代码:


a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
time.sleep(3)
a.pause()
time.sleep(2)
a.stop()

测试的结果:

查看图片

  这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.

  但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

--结束END--

本文标题: python 线程的暂停, 恢复, 退出详解及实例

本文链接: https://lsjlt.com/news/13923.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 线程的暂停, 恢复, 退出详解及实例
    python 线程 暂停, 恢复, 退出 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应...
    99+
    2022-06-04
    线程 详解 实例
  • C#中ManualResetEvent实现线程的暂停与恢复
    目录背景ManualResetEvent介绍实现设计背景 前些天遇到一个需求,在没有第三方源码的情况下,刷新一个第三方UI,并且拦截到其ajax请求的返回结果。当结果为AVALIAB...
    99+
    2024-04-02
  • C#怎么实现线程的暂停与恢复
    在C#中,可以使用`Thread.Suspend()`方法来暂停一个线程,使用`Thread.Resume()`方法来恢复一个暂停的...
    99+
    2023-08-08
    C#
  • python线程暂停和恢复的方法是什么
    在Python中,可以使用`threading`模块来创建和管理线程。在线程中,可以使用`Event`对象或者`Condition`...
    99+
    2023-10-26
    python
  • Golang与python线程详解及简单实例
    Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var c...
    99+
    2022-06-04
    线程 详解 实例
  • python线程及多线程实例讲解
    进程和线程一、进程进程是程序的分配资源的最小单元;一个程序可以有多个进程,但只有一个主进程;进程由程序、数据集、控制器三部分组成。二、线程线程是程序最小的执行单元;一个进程可以有多个线程,但是只有一个主线程;线程切换分为两种:一种是I/O切...
    99+
    2023-01-31
    线程 多线程 实例
  • Python 爬虫多线程详解及实例代码
    python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。 虽然...
    99+
    2022-06-04
    爬虫 多线程 详解
  • Python 多线程实例详解
    Python 多线程实例详解 多线程通常是新开一个后台线程去处理比较耗时的操作,Python做后台线程处理也是很简单的,今天从官方文档中找到了一个Demo. 实例代码: import threading...
    99+
    2022-06-04
    多线程 详解 实例
  • 详解Java线程池如何实现优雅退出
    目录shutdown()方法shutdownNow()方法awaitTermination(long, TimeUnit)方法在【高并发专题】中,我们从源码角度深度分析了线程池中那些...
    99+
    2024-04-02
  • JAVA线程sleep()和wait()详解及实例
    JAVA线程sleep()和wait()详解及实例sleepsleep是Thread的一个静态(static)方法。使得Runnable实现的线程也可以使用sleep方法。而且避免了线程之前相互调用sleep()方法,引发死锁。sleep(...
    99+
    2023-05-31
    java线程 sleep() wait()
  • Python的进程,线程和协程实例详解
    目录相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结相关介绍 Python是一种跨...
    99+
    2024-04-02
  • 实例详解Python的进程,线程和协程
    目录前言前提条件相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结前言 本文用Pyt...
    99+
    2024-04-02
  • win7无线鼠标在使用过程中出现短暂停顿的解决方法
      现在的电子设备产品,已经开始走向无线时代,无线网络、无线鼠标、无线键盘等等。在win7系统中,安装了无线鼠标,在使用过程中,发现无线鼠标有时发生短暂停顿。   具体方法:   第一步、电脑中打开“控制面板...
    99+
    2023-06-07
    win7 无线鼠标 停顿 解决 鼠标 过程 方法
  • Java线程的停止实现原理详解
    目录线程停止的原理如何正确停止线程在普通情况下停止线程在阻塞情况下停止线程线程在每次迭代后都阻塞停止线程的最佳实践错误停止的方法被弃用的stop,suspend和resume方法用v...
    99+
    2023-01-28
    Java线程的停止 Java线程原理
  • Linux中多线程详解及简单实例
    Linux中多线程详解及简单实例 1.概念 进程:运行中的程序。 线程:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。 2.为什么要有线程? 用fork调用进程...
    99+
    2022-06-04
    多线程 详解 实例
  • python 网络编程详解及简单实例
    python 网络编程详解 网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得...
    99+
    2022-06-04
    详解 网络编程 实例
  • python 编程之twisted详解及简单实例
    python 编程之twisted详解 前言: 我不擅长写socket代码。一是用c写起来比较麻烦,二是自己平时也没有这方面的需求。等到自己真正想了解的时候,才发现自己在这方面确实有需要改进的地方。最近由...
    99+
    2022-06-04
    详解 实例 简单
  • Golang实现程序优雅退出的方法详解
    目录1. 背景2. 常见的几种平滑关闭2.1 http server 平滑关闭2.2 gRPC server 平滑关闭2.3 worker 协程平滑关闭2.4 实现 io.Close...
    99+
    2024-04-02
  • python QT界面关闭线程池的线程跟随退出问题怎么解决
    今天小编给大家分享一下python QT界面关闭线程池的线程跟随退出问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2023-07-04
  • Python实现线程池工作模式的案例详解
    目录01、客户机/服务器通信逻辑02、数据交换协议03、服务器主体逻辑04、服务器会话线程05、客户机主体逻辑06、客户机发送数据07、客户机接收数据08、客户机界面设计09、线程池...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作