单线程实现多个定时器
NewTimer.py
#!/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
#system resolution millisecond
class NewTimer(object):
#set enough time make thread sleep, when NewTimer empty set enoug time, too
#make sure sum of your timer call back function execute time shorter than resolution
#todo use a worker thread to operate timer call back function
def __init__(self, resolution=1000):
global TimerStamp
TimerStamp = int(time.time() * 1000)
self.nofire = sys.maxint #next fire time interval
self.firestamp = self.nofire + TimerStamp
self.resolution = resolution# 1s
self.lock = threading.RLock()
self.wait = dict()
self.ready = dict()
self._start()
""" private operate ready list """
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)
try:
box = boxs.pop(slot.id)
if not boxs:
self.ready.pop(slot.fire)
except (AttributeError, KeyError):
raise CancelFail
""" inside """
def _start(self):
global TimerStamp
try:
self.firestamp = sorted( self.ready.keys() )[0]
stamp = float((TimerStamp + self.firestamp - int(time.time()*1000)))/1000
except IndexError:
self.firestamp = self.nofire
stamp = self.nofire
try:
self.timer.cancel()
except AttributeError:
pass
self.timer = Timer( stamp, self.hander)
self.timer.start()
def hander(self, *args, **kwargs):
""" find time arrive slot, do it function """
self.lock.acquire()
try:
boxs = self.ready.pop( self.firestamp )
slots = boxs.values()
except KeyError:
slots = []
for slot in slots:
if slot.period:
slot.pc += 1
if slot.pc != slot.period:
slot.fire = slot.interval + slot.fire
self._addToReadyList(slot, slot.fire)
elif slot.period == -1:
slot.fire = slot.interval + slot.fire
self._addToReadyList(slot, slot.fire)
""" """
self._start()
self.lock.release()
for slot in slots:
try:
slot.function(slot.args, slot.kwargs)
except Exception:
print "slot id %s, timer function fail" % slot.id
""" operate new timer manager itself """
def stop(self):
self.timer.cancel()
""" new timer manager """
def add(self, period=0, interval=1, function=None, args=[], kwargs={}):
"""
period: one time = 0, times = >0, always = -1
interval: timer fire relative TimerReference
function: when timer fire, call back function
args,kwargs: callback function args
"""
interval = int(interval) * self.resolution#seconds
if interval interval = self.resolution
slot = Slot( period, interval, function, *args, **kwargs )
box = dict([(slot.id, slot)])
self.wait.update(box)
return slot
def remove(self, slot):
if isinstance(slot, Slot):
self.cancel(slot)
try:
self.wait.pop(slot.id)
except KeyError:
print "wait dict not has the cancel timer"
""" timer api """
def reset(self, slot):
if isinstance(slot, Slot):
self.cancel(slot)
slot.pc = 0
self.start(slot)
def start(self, slot):
def NewTimerStamp(timebase, resolution):
nowoffset = int(time.time() * 1000) - timebase
if nowoffset % resolution currentstamp = nowoffset / resolution
else:
currentstamp = (nowoffset + resolution - 1) / resolution
return currentstamp * 1000
global TimerStamp
if isinstance(slot, Slot):
firestamp = slot.interval + NewTimerStamp(TimerStamp, self.resolution)
slot.fire = firestamp
self.lock.acquire()
self._addToReadyList(slot, firestamp)
if self.firestamp > slot.fire:
self._start()
self.lock.release()
def cancel(self, slot):
if isinstance(slot, Slot):
try:
self.lock.acquire()
self._delFromReadyList(slot)
self._start()
self.lock.release()
except CancelFail:
self.lock.release()
def hello( *args, **kargs):
print args[0], datetime.datetime.now()
if __name__ == "__main__":
print "start test timer", datetime.datetime.now()
nt = NewTimer(500)
t0 = nt.add( -1, 5, hello, [0])
t1 = nt.add( 4, 7, hello, [1])
t2 = nt.add( 1, 3, hello, [2])#
t3 = nt.add( 1, 4, hello, [3])#
t4 = nt.add( 4, 5, hello, [4])
t5 = nt.add( 12, 5, hello, [5])#
t6 = nt.add( 9, 7, hello, [6])
t7 = nt.add( 1, 8, hello, [7])#
t8 = nt.add( 40, 1, hello, [8])
nt.start( t0 )
nt.start( t1 )
nt.start( t2 )#
nt.start( t3 )#
nt.start( t4 )
nt.start( t5 )#
nt.start( t6 )
nt.start( t7 )#
nt.start( t8 )
nt.cancel(t2)
nt.cancel(t3)
nt.remove(t5)
nt.remove(t3)
time.sleep(3)
nt.start(t2)
nt.cancel(t8)
time.sleep(300)
nt.stop()
print "finish test timer", datetime.datetime.now()

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

該教程建立在先前對美麗湯的介紹基礎上,重點是簡單的樹導航之外的DOM操縱。 我們將探索有效的搜索方法和技術,以修改HTML結構。 一種常見的DOM搜索方法是EX

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境