python暂停语句_Python除了time.sleep,你还有⼀个暂停代码
的⽅法
我们知道,在 Python ⾥⾯可以使⽤time.sleep来让代码暂停⼀段时间,例如:
import time
print('...部分代码...')
time.sleep(5)
print('...剩下的代码...')
程序⾸先打印出...部分代码...,然后等待5秒钟,再打印出...剩下的代码...。
现在⼤家想⼀想,有没有什么办法,在不使⽤time.sleep的情况下,让程序暂停5秒?
你可能会说,⽤requests访问⼀个延迟5秒的⽹址、或者⽤递归版算法计算斐波那契数列第36位……这些奇技淫巧。
不过今天我说的,是另外⼀个东西,threading模块⾥⾯的Event。
我们来看看它的⽤法:
import threading
event = threading.Event()
print('...部分代码...')
event.wait(5)
print('...剩下的代码...')
这样⼀来,程序⾸先打印出...部分代码...,然后等待5秒钟,再打印出...剩下的代码...。
功能看起来跟time.sleep没什么区别,那为什么我要特别提到它呢?因为在多线程⾥⾯,它⽐time.sleep更有⽤。我们来看⼀个例⼦:import threading
class Checker(threading.Thread):
def __init__(self, event):
super().__init__()
self.event = event
def run(self):
while not self.event.is_set():
print('检查 redis 是否有数据')
time.sleep(60)
trigger_async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
event.set()
我来解释⼀下这段代码的意思。在主线程⾥⾯,我调⽤trigger_async_task()触发了⼀个异步任务。这个任务多久完成我并不清楚。但是这个任务完成以后,它会往 Redis ⾥⾯发送⼀条消息,只要 Redis 有这个消息了,我就知道它完成了。所以我要创建⼀个 checker ⼦线程,每60秒去 Redis⾥⾯检查任务是否完成。如果没有完成,就暂停60秒,然后再检查。
但某些情况下,我不需要等待了,例如⽤户主动取消了任务。这个时候,我就想提前结束这个 checker ⼦线程。
但是我们知道,线程是不能从外⾯主动杀死的,只能让它⾃⼰退出。所以当我执⾏event.set()后,⼦线程⾥⾯self.event.is_set()就会返回False,于是这个循环就不会继续执⾏了。
可是,如果某⼀轮循环刚刚开始,我在主线程⾥⾯调⽤了event.set()。此时,⼦线程还在time.sleep中,那么⼦线程需要等待60秒才会退出。
但如果我修改⼀下代码,使⽤self.event.wait(60):
import threading
class Checker(threading.Thread):
菜鸟教程python函数def __init__(self, event):
super().__init__()
self.event = event
def run(self):
while not self.event.is_set():
print('检查 redis 是否有数据')
self.event.wait(60)
trigger_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
event.set()
那么,即便self.event.wait(60)刚刚开始阻塞,只要我在主线程中执⾏了event.set(),⼦线程⾥⾯的阻塞⽴刻就会结束。于是⼦线程⽴刻就会结束。不需要再⽩⽩等待60秒。
并且,event.wait()这个函数在底层是使⽤ C 语⾔实现的,不受 GIL 锁的⼲扰。
注意:如果你是打算python⾼薪⼯作的话。我建议你多写点真实的企业项⽬积累经验。不然⼯作都不到,当然很多⼈没进过企业,怎么会存在项⽬经验呢? 所以你得多企业项⽬实战多练习下撒。如果你很懒不想,也可以进我的Python交流圈:1156465813。⽂件⾥⾯有我之前在做开发写过的⼀些真实企业项⽬案例。你可以拿去学习,不懂都可以在裙⾥我,有空会耐⼼给你解答下。
以下内容⽆⽤,为本篇博客被搜索引擎抓取使⽤
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是⼲什么的 零基础学 python 要多久 python 为什么叫爬⾍
python 爬⾍菜鸟教程 python 爬⾍万能代码 python 爬⾍怎么挣钱
python 基础教程 ⽹络爬⾍ python python 爬⾍经典例⼦
python 爬⾍
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)以上内容⽆⽤,为本篇博客被搜索引擎抓取使⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论