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

文章对比了Python中time.sleep()和threading.Event在控制程序暂停时的不同,强调在多线程环境里,Event对象能提供更灵活的控制,特别是在需要取消任务时。Event.wait()方法允许线程在接收到事件时立即停止等待,提高效率,并且其底层实现不受GIL锁的影响。
摘要由CSDN通过智能技术生成

        在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 锁的干扰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值