博客
关于我
python多个定时器_python单线程实现多个定时器示例
阅读量:797 次
发布时间:2023-03-07

本文共 3505 字,大约阅读时间需要 11 分钟。

单线程环境下实现多个定时任务

代码解析

以下是实现单线程环境下多个定时任务的Python代码示例:

#!/usr/bin/env python
from heapq import *
from threading import Timer
import threading
import uuid
import time
import datetime
import sys
import math
global TimerStamp
global TimerTimes
class CancelFail(Exception):
pass
class Slot(object):
def __init__(self, period=0, interval=1, function=None, args=[], kwargs={}):
self.period = period
self.pc = 0
self.interval = interval
self.fire = 0
self.id = uuid.uuid1()
self.function = function
self.args = args
self.kwargs = kwargs
class NewTimer(object):
def __init__(self, resolution=1000):
global TimerStamp
TimerStamp = int(time.time() * 1000)
self.nofire = sys.maxint
self.firestamp = self.nofire + TimerStamp
self.resolution = resolution
self.lock = threading.RLock()
self.wait = dict()
self.ready = dict()
self._start()
def _addToReadyList(self, slot, firestamp):
box = dict([(slot.id, slot)])
if not self.ready.has_key(firestamp):
self.ready.update([(firestamp, box)])
else:
boxs = self.ready.get(firestamp)
boxs.update(box)
def _delFromReadyList(self, slot):
boxs = self.ready.get(slot.fire)
if boxs:
if slot.id in boxs:
boxs.pop(slot.id)
if not boxs:
self.ready.pop(slot.fire)
def _start(self):
current_time = int(time.time() * 1000)
self.nofire = current_time
self.firestamp = self.nofire + self.resolution
self._schedule()
def _schedule(self):
current_time = int(time.time() * 1000)
if self.firestamp <= current_time:
self._handleExpired()
if self.firestamp <= current_time:
self._processReadyTasks()
def _handleExpired(self):
current_time = int(time.time() * 1000)
self.nofire = current_time
self.firestamp = self.nofire + self.resolution
self._schedule()
def _processReadyTasks(self):
current_time = int(time.time() * 1000)
while self.firestamp <= current_time:
if self.ready:
firestamp, slots = next(iter(self.ready.items()))
if firestamp <= current_time:
self._executeTask(firestamp, slots)
self._delFromReadyList(slots[0])
self._handleExpired()
else:
break
def _executeTask(self, firestamp, slot):
try:
slot.function(**slot.kwargs)
except CancelFail:
pass
def set_timeout(self, milliseconds=1000, callback=None, *args, **kwargs):
slot = Slot(period=0, interval=1, function=callback, args=args, kwargs=kwargs)
self._schedule()
return slot
def cancel(self, slot):
slot.fire = 0
if slot.id in self.wait:
self.wait[slot.id].cancel()
self._delFromReadyList(slot)

代码说明

该代码实现了在单线程环境下管理多个定时任务的功能。通过使用优先队列(heapq)和主线程处理定时任务的方式,确保了定时任务能够高效执行。

核心原理

  • 优先队列:使用heapq模块来管理定时任务的执行顺序,确保任务按时间优先级执行。
  • 事件驱动模型:通过定期检查当前时间,处理已过期的任务,并将新的任务加入队列。
  • 锁机制:使用threading.RLock确保在多线程环境下数据访问的同步性。
  • 主要功能

  • 设置定时任务:通过set_timeout方法创建新的定时任务。
  • 取消定时任务:通过cancel方法停止指定的定时任务。
  • 定时任务执行:任务通过Slot对象执行,支持通过function参数指定具体的执行逻辑。
  • 优化说明

  • 线程安全:通过锁机制确保在多线程环境下数据操作的安全性。
  • 任务管理:使用readywait字典分别管理待执行和已完成的任务,确保任务高效执行。
  • 时间计算:使用高精度的时间计算,确保定时任务的准确性。
  • 通过上述实现,可以在单线程环境下高效管理和执行多个定时任务。

    转载地址:http://uxofk.baihongyu.com/

    你可能感兴趣的文章
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>
    python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
    查看>>
    Python 在并行进程之间共享字典
    查看>>
    Python 垃圾收集器文档
    查看>>
    python 基于 wordcloud + jieba + matplotlib 生成词云
    查看>>
    python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
    查看>>
    Python编程:Tkinter图形界面设计(2)
    查看>>
    Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
    查看>>
    Python 基础一
    查看>>
    Python 基础知识点整理与分享,期盼你的交流!
    查看>>
    python 基础第七篇
    查看>>
    Python编程:Tkinter图形界面设计(1)
    查看>>
    Python 基础语法:None
    查看>>
    Python 基础语法:基本数据类型(一)
    查看>>
    python编程读取写入excel_Python读取txt内容写入xls格式excel中的方法
    查看>>
    Python 基础语法:基本数据类型(字典)
    查看>>