Python多线程中比time.sleep更好用的暂停方式
作者:没有刺的仙人掌
这篇文章主要介绍了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 锁的干扰。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。