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 ...
随机推荐
- Pandas初学者代码优化指南
原文:A Beginner’s Guide to Optimizing Pandas Code for Speed 作者:Sofia Heisler 翻译:无阻我飞扬 摘要:Pandas 是Pytho ...
- C# WinForm通用皮肤
最近做一个小项目,是以前的一个旧项目改造升级,添加些新功能需要用到c#来开发, 话说最近2年都在用Qt开发,c#都生疏不少,赶紧捡起来, 看到原来的就知道需要重新设计,所有打算找一款通用皮肤省事 下面 ...
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- jedata日期控件的开始结束日期设置
<span class="wstxt">开始日期:</span><input type="text" class="wo ...
- chrome hosts
# Go Hosts# 2017-05-02 02:13:04# Localhost (DO NOT REMOVE)127.0.0.1 localhost::1 localhost ip6 ...
- suffix word ard ar arian arium atic ation atory ator out ~3
1★ ard 不好的人 2★ ar ~的:~人物 1● arian ~人.物 2● arium 地点,场地 3●aster 不怎么样的人 1● ast ~人 ...
- linux用户管理 查看用户信息
LINUX系统中用户登录查看命令 W命令 [root@ssgao1987 ~]# w 04:57:01 up 11:50, 2 users, load average: 0.00, 0.00, 0 ...
- bzoj4310
题解: 后缀数组求出本质不同的串 然后二分答案 贪心判断是否可行 代码: #include<bits/stdc++.h> ; using namespace std; typedef lo ...
- flask-admin fileadmin 上传文件,中文名的解决方案 重写部分secure_filename
class upload_view(FileAdmin): def _save_form_files(self, directory, path, form): super() filename = ...
- core net 实现post 跟get
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using Syst ...