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基础入门之列表(一)

    python基础入门之列表(一)

    在Python中,列表(list)是常用的数据类型。列表由一系列按照特定顺序排列的项(item)组成。
    2021-06-06
  • python django 原生sql 获取数据的例子

    python django 原生sql 获取数据的例子

    今天小编就为大家分享一篇python django 原生sql 获取数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python安装scipy的方法步骤

    python安装scipy的方法步骤

    在本篇文章里小编给各位分享了关于python怎么安装scipy的具体方法和实例代码,需要的朋友们学习下。
    2019-06-06
  • python解压zip包中文乱码解决方法

    python解压zip包中文乱码解决方法

    这篇文章主要介绍了python解压zip包中文乱码解决方法,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-11-11
  • python反编译学习之字节码详解

    python反编译学习之字节码详解

    这篇文章主要给大家介绍了关于python反编译学习之字节码的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 使用python socket分发大文件的实现方法

    使用python socket分发大文件的实现方法

    今天小编就为大家分享一篇使用python socket分发大文件的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python可变参数用法实例分析

    Python可变参数用法实例分析

    这篇文章主要介绍了Python可变参数用法,结合实例形式分析了Python可变参数的具体定义、使用方法与相关注意事项,需要的朋友可以参考下
    2017-04-04
  • 在pycharm中实现删除bookmark

    在pycharm中实现删除bookmark

    今天小编就为大家分享一篇在pycharm中实现删除bookmark,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 浅谈python可视化包Bokeh

    浅谈python可视化包Bokeh

    这篇文章主要介绍了浅谈python可视化包Bokeh,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Python中的分支与循环结构解读

    Python中的分支与循环结构解读

    这篇文章主要介绍了Python中的分支与循环结构解读,在Python编程中,分支(Branch)和循环(Loop)是掌握的关键要素之一,它们允许您根据条件执行不同的代码块,以及重复执行特定任务,需要的朋友可以参考下
    2023-10-10

最新评论