Python多线程中比time.sleep更好用的暂停方式

 更新时间:2024年02月18日 16:53:15   作者:没有刺的仙人掌  
这篇文章主要介绍了Python多线程中比time.sleep更好用的暂停方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Python多线程比time.sleep更好用的暂停

在python代码中,如果需要程序暂停一段时间,通常情况下使用的是time.sleep()方法。

示例代码:

import time
 
print('...部分代码...')
time.sleep(3)
print('...剩下的代码...')

运行结果:

在多线程中,还有另外一种方法,threading模块中的Event。

示例代码:

import threading
 
event = threading.Event()
print('...部分代码...')
event.wait(3)
print('...剩下的代码...')

运行结果:

使用event()方法,首先先打印,然后等待3秒,再继续执行后面的程序。

以上看起来和time.sleep()方法类似

接下来看一些例子来展示event()的好处

示例代码:

import threading
import time
 
 
class Checker(threading.Thread):
    def __init__(self, event):
        super().__init__()
        self.event = event
 
    def run(self) -> None:
        while not self.event.is_set():
            print("进行检查某个任务状态!")
            time.sleep(50)
 
 
# 某个异步任务
# async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
 
# 异步任务检查
# if user_cancel_task():
#     event.set()

运行结果:

但是在某种情况下,如果主动取消任务,就不需要等待,这个时候就需要结束Checker这个子线程了。

线程是不能从外面主动杀死的,只能让它自己退出。当执行event.set()后,子线程里面self.event.is_set()就会返回 False,于是这个循环就不会继续执行了。

可是,如果某一轮循环刚刚开始,我在主线程里面调用了event.set()。此时,子线程还在time.sleep中,那么子线程需要等待50秒才会退出。这是就可以体现出event()的好处了。使用self.event.wait(60)。

示例代码:

import threading
 
 
class Checker(threading.Thread):
    def __init__(self, event):
        super().__init__()
        self.event = event
 
    def run(self) -> None:
        while not self.event.is_set():
            print("进行检查某个任务状态!")
            self.event.wait(50)
 
 
# 某个异步任务
# async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
 
# 异步任务检查
# if user_cancel_task():
#     event.set()

运行结果:

即便self.event.wait(50)刚刚开始阻塞,只要我在主线程中执行了event.set(),子线程里面的阻塞立刻就会结束。

于是子线程立刻就会结束。不需要再白白等待50秒。

并且,event.wait()这个函数在底层是使用 C 语言实现的,不受 GIL 锁的干扰。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python如何把字符串类型list转换成list

    python如何把字符串类型list转换成list

    这篇文章主要介绍了python如何吧字符串类型list转换成list,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • python数据归一化及三种方法详解

    python数据归一化及三种方法详解

    这篇文章主要介绍了python数据归一化及三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python实现对数坐标系绘制与自定义映射

    Python实现对数坐标系绘制与自定义映射

    这篇文章主要为大家学习介绍了如何利用Python实现对数坐标系绘制与坐标自定义映射,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-08-08
  • Python Excel数据处理之xlrd/xlwt/xlutils模块详解

    Python Excel数据处理之xlrd/xlwt/xlutils模块详解

    在复杂的Excel业务数据处理中,三兄弟扮演的角色缺一不可。如何能够使用xlrd/xlwt/xlutils三个模块来实现数据处理就是今天的内容,希望对大家有所帮助
    2023-03-03
  • Python不使用库进行矩阵运算详解

    Python不使用库进行矩阵运算详解

    这篇文章主要介绍了Python不使用库进行矩阵运算详解,矩阵乘法中,需要判断两个矩阵是否可以进行相乘,即前一个矩阵的列是否等于后一个矩阵的行,,需要的朋友可以参考下
    2023-08-08
  • Python 虚拟环境迁移到其他电脑的实现

    Python 虚拟环境迁移到其他电脑的实现

    本文主要介绍了Python 虚拟环境迁移到其他电脑的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Python-VTK隐式函数属性选择和剪切数据

    Python-VTK隐式函数属性选择和剪切数据

    这篇文章主要介绍了Python-VTK隐式函数属性选择和剪切数据,VTK,是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化,下面文章主题相关详细内容需要的小伙伴可以参考一下
    2022-04-04
  • Python存储json数据发生乱码的解决方法

    Python存储json数据发生乱码的解决方法

    当使用json.dump()把python对象转换为json后存储到文件中时,文件可能会出现乱码的问题,本篇文章可以帮助您解决乱码问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Python学习之二叉树实现的示例详解

    Python学习之二叉树实现的示例详解

    这篇文章主要为大家详细介绍了Python实现二叉树的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-04-04
  • python skimage 连通性区域检测方法

    python skimage 连通性区域检测方法

    今天小编就为大家分享一篇python skimage 连通性区域检测方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论