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的更多相关文章

  1. .NetCore简单封装基于IHttpClientFactory的HttpClient请求

    IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...

  2. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  3. python实现简单tftp(基于udp)

    tftp是基于udp的协议 实现简单的tftp,首先要有tftp的协议图. tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务. 操作码:1.上传 2.下 ...

  4. MongoDB Python官方驱动 PyMongo 的简单封装

    最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...

  5. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  6. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  7. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  8. 最简单的基于FFMPEG的封装格式转换器(无编解码)

    本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...

  9. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

随机推荐

  1. C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...

  2. matlab plot line settings

  3. bzoj4278

    题解: 把第一个串放好,加一个oo 然后把第二个串倒序放进来 然后就是http://www.cnblogs.com/xuanyiming/p/8510231.html这一题了 代码: #include ...

  4. ActiveMQ的P2P示例

    ActiveMQ的P2P示例(点对点通信) (1)下载安装activemq,启动activeMQ. 详细步骤参考博客:http://www.cnblogs.com/DFX339/p/9050878.h ...

  5. (C/C++学习笔记)附页: C/C++各数据类型的相关说明

  6. fast-rcnn里的一些具体内容

    NMS:Non-Maximum Suppression(非极大值抑制) 假设从一个图像中得到了2000个region proposals,通过在RCNN和SPP-net之后我们会得到2000*4096 ...

  7. 深入理解java虚拟机---java虚拟机的发展史(四)

    1.java虚拟机 A:java虚拟机有很多个版本,但是我们经常使用的是sun公司的HotSpot,可以通过以下命令获取java虚拟机版本 B:JAVA虚拟机分类: 1.Sun Class VM 2. ...

  8. Java实验2

    1.给定一组字符,编程输出里面数值最大者. package experiment; import java.util.Arrays; public class ShenYue { public sta ...

  9. 强震记录和GPS记录,地震波记录的区别

    强震记录的是加速度数据,但gps记录的是位移数据.这样的话,强震记录应该说是近场地震数据: 那么, 为什么不干脆用近场的地震波仪器呢,是因为,地震仪记录会限幅,导致记录不全.

  10. 究竟 javascript 错误处理有哪些类型?

    有时候,在自己封装的工具函数中,不传参或传入了错误类型的参数,也要适当的抛出一些错误以示警告:使用框架不正常情况下也会抛出错误,如果对错误一无所知,便无从下手调试.综合上述,了解错误的处理机制是多么必 ...