PYTHON 定时器简单封装,基于SCHED
python fresher,轻拍。
在写后台服务时经常会遇到很多定时器的场景,threading.Timer类每实例化一个定时器会有一个新线程去执行,在客户端使用倒是没有问题,如果是服务器端定时器数量多了会影响性能。通常的做法是一个线程按照指定精度发出Ticker,然后检查有没有设置定时器,由则触发;同时要提供SetTimer,KillTimer方法。常用的算法有基于小根堆,时间轮。
本例采用py内置模块sched调度器,sched模块内部使用的优先级队列管理任务,性能未测。
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import sched
import time
import threading
'''
定时器类,基于sched调度,独立线程服务
'''
class Timer(threading.Thread):
'''初始化'''
def __init__(self,interval=0.05):
threading.Thread.__init__(self)
self.__sch = sched.scheduler(time.time,time.sleep)
self.__flag = True
self.__min_interval = interval
#overload
def run(self):
while self.__flag:
self.__sch.run()
time.sleep(self.__min_interval)
continue
#overload
def Start(self):
self.start()
def SetTimer(self,interval,func,args):
return self.__sch.enter(interval,0,func,args)
def KillTimer(self,event):
try:
self.__sch.cancel(event)
except ValueError as e:
print("KillTimer err:",e)
else:
print("KillTimer unknow err")
def Destroy(self):
self.__flag=False
if __name__ == "__main__":
t=Timer()
t.Start()
def func(msg):
print("timeout ", msg)
e=t.SetTimer(1,func,("msg",))
print("set timer",e)
#t.KillTimer(e)
t.Destroy()
已知问题:定时器由单线程执行并触发执行,定时器函数的执行会由很大影响。
if __name__ == "__main__":
t=Timer()
t.Start()
def func(msg):
print("timeout ", msg," now ",time.time())
time.sleep(2)
e = t.SetTimer(1, func, ("msg1",))
e = t.SetTimer(1, func, ("msg2",))
执行结果:
timeout msg1 now 1513819586.3577309
timeout msg2 now 1513819588.3586824
func与定时器是同一线程执行,如果新开线程执行func对于耗时少的func又不划算;这点就体现出golang的优势,定时器触发后直接go func(msg),系统开销很小。
PYTHON 定时器简单封装,基于SCHED的更多相关文章
- .NetCore简单封装基于IHttpClientFactory的HttpClient请求
IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...
- iOS sqlite 增删改查 简单封装(基于 FMDB)
/** * 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * * 基于 FMDB * * 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...
- python实现简单tftp(基于udp)
tftp是基于udp的协议 实现简单的tftp,首先要有tftp的协议图. tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务. 操作码:1.上传 2.下 ...
- MongoDB Python官方驱动 PyMongo 的简单封装
最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...
- Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例
一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
- 简单的基于Vue-axios请求封装
具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...
随机推荐
- Mysql可重复读原理
mysql可重复读现象及原理分析 InnoDB---可重复读隔离级别的底层实现原理 概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插 ...
- vue 父组件通过props向子组件传递数据/方法的方式
参考网址:https://segmentfault.com/a/1190000010507616 下面栗子中, callback是传递父组件的方法, mutationName是传递父组件的数据, Ap ...
- QWebView崩溃的问题
http://www.cnblogs.com/kobe-echo/p/5720765.html#undefined
- js重写系统的弹框
//调用系统的弹框,不显示地址 window.alert = function(name){ var iframe = document.createElement("IFRAME& ...
- !important 的绝对控制样式
<head> <style type="text/css"> div{background-color: blue !important;} </st ...
- VIM编辑配置文件基本操作
vim /etc/apt/sources.list 按insert键进入编辑状态 编辑完成以后按ESC退出编辑状态 输入 ":"进入命令状态,常用命令: 1.W:write ,写 ...
- 女生可不可以进入IT行业做Linux运维工程师?
不知从何时起有那么一个不成文的理论:女生不适合做IT.在很多人看来,IT is a men’s world,女生学IT是件匪夷所思的事情.在传统的思维当中,女生只适合从事像教师.会计.公务员等稳定的职 ...
- 改变Cube的Shader下的Alpha值,实现Cube若隐若现的效果。
private float rotaSpeed = 5f; private float timer = 1; private bool flag = true; private float delay ...
- PC/FORTH 循环
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- oracle数据导入导出数据与编码格式不正确
1.导入dmp文件 imp ZHCG/ZHCG@ORCL file=E:\20160902.1007.dmp full=y 2.导出数据 exp system/manager@ORCL file ...