一、基础概念
在实际应用中,我们需要使用定时器去触发一些事件,比如我在实际工作中写一个模拟入会的机器人,需要当加入会议成功后,维持和服务器的心跳。
Timer最基本的理解是定时器,可以启动多个定时任务,定时的去执行任务,这些定时器任务是异步执行,所以不存在等待顺序执行顺序。
定时器只能执行一次,如果需要重复执行,需要重新添加任务。
导入模块
from threading import Timer
timer = threading.Timer(interval, function, args=None, kwargs=None)
参数介绍:
interval — 定时器间隔,间隔多少秒之后启动定时器任务(单位:秒);
function — 线程函数;
args — 线程参数,可以传递元组类型数据,默认为空(缺省参数);
kwargs — 线程参数,可以传递字典类型数据,默认为空(缺省参数);
二、实际代码
1、当请求心跳成功后才开始定时器,使用timer.start()
@retry()
def heart_beat(self):
# 维持心跳
url = self.env + "/ccm/v1/member/heartbeat?app_id=winPcAppid&room_id=" + str(self.roomId)
payload = json.dumps({
"tid": "rongxintoken154153",
"memberId": self.memberId,
"memberSessionId": self.memberSessionId
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
if response.json()["error"]["code"] == 0:
# 返回成功才开始定时器
timer = threading.Timer(30, self.heart_beat) # 每30秒运行,心跳默认4分钟超时
timer.start()
print("%s 心跳:" % self.memberId, response.json())
else:
# 推出维持心跳
print("心跳维持失败:", response.json())
# timer.cancel()
print("退出维持心跳。开始会议结束")
2、当请求心跳失败后取消定时器,使用timer.cancel()
@retry()
def heart_beat(self):
# 维持心跳
url = self.env + "/ccm/v1/member/heartbeat?app_id=winPcAppid&room_id=" + str(self.roomId)
payload = json.dumps({
"tid": "rongxintoken154153",
"memberId": self.memberId,
"memberSessionId": self.memberSessionId
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
timer = threading.Timer(30, self.heart_beat) # 每30秒运行,心跳默认4分钟超时
if response.json()["error"]["code"] == 0:
timer.start()
print("%s 心跳:" % self.memberId, response.json())
else:
# 推出维持心跳
print("心跳维持失败:", response.json())
# 返回不成功,定时器销毁
timer.cancel()
print("退出维持心跳。开始会议结束")