Python多线程中比time.sleep更好用的暂停方法
2023-09-11 14:15:15 时间
在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 操作 Kafka --- kafka-python
- Python脚本写端口扫描器(socket,python-nmap)
- python执行脚本加参数_命令行运行Python脚本时传入参数的三种方式详解以及argparse子命令subparsers()方法
- python魔法方法之-Python __repr__()方法:显示属性
- Python __missing__ 魔法方法
- 【华为OD机试真题 python】整数对最小和 【2022 Q4 | 100分】
- python多线程的使用(导入线程模块、创建子线程任务、启动子线程任务、获取当前执行的线程号)
- 学会Python有哪些可以做的兼职?所有途径全在这里了...
- 【Python】【PyPI】twine模块打包python项目上传pypi
- ROS Noetic入门笔记(七)使用Python编写简单的Publisher与Suscriber
- 9. python爬虫——高性能单线程 / 多线程 / 线程池 / 异步爬虫使用方法教学
- 【Python基础】我的第一个 python 程序
- Python 基础 之 Ubuntu 上安装 python 和 python-pip
- python:多线程
- 【python百度智能云】:Python — 三种获取__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION方法。
- python自动化扫描,多线程枚举获取wifi信息,让你走在任何一个地方都能上网
- Python 多线程
- Python opencv-python 简单测试