最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python單線程實現(xiàn)多個定時器示例

 更新時間:2014年03月30日 09:45:26   作者:  
這篇文章主要介紹了python單線程實現(xiàn)多個定時器示例,需要的朋友可以參考下

單線程實現(xiàn)多個定時器

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 < self.resolution:
            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 < resolution / 10:
                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()

相關文章

  • 我們?yōu)槭裁匆獪p少Python中循環(huán)的使用

    我們?yōu)槭裁匆獪p少Python中循環(huán)的使用

    這篇文章主要介紹了我們?yōu)槭裁匆獪p少Python中循環(huán)的使用,我將闡述 Python 提供的一些簡單但是非常有用的結構,一些小技巧以及一些我在數(shù)據(jù)科學工作中遇到的案例。我將討論 Python 中的 for 循環(huán),以及如何盡量避免使用它們,需要的朋友可以參考下
    2019-07-07
  • python 實現(xiàn)Flask中返回圖片流給前端展示

    python 實現(xiàn)Flask中返回圖片流給前端展示

    今天小編就為大家分享一篇python 實現(xiàn)Flask中返回圖片流給前端展示,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 教你使用Python實現(xiàn)一個簡易版Web服務器

    教你使用Python實現(xiàn)一個簡易版Web服務器

    這篇文章主要介紹了教你使用Python實現(xiàn)一個簡易版Web服務器,本篇文章將通過實現(xiàn)一個簡易版的Web服務器,幫助讀者理解Python網(wǎng)絡編程的基本概念和技巧,需要的朋友可以參考下
    2023-04-04
  • 使用Python和xlwt向Excel文件中寫入中文的實例

    使用Python和xlwt向Excel文件中寫入中文的實例

    下面小編就為大家分享一篇使用Python和xlwt向Excel文件中寫入中文的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦

    15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦

    這篇文章主要介紹了15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-10-10
  • 基于Tensorflow使用CPU而不用GPU問題的解決

    基于Tensorflow使用CPU而不用GPU問題的解決

    今天小編就為大家分享一篇基于Tensorflow使用CPU而不用GPU問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python之——生成動態(tài)路由軌跡圖的實例

    Python之——生成動態(tài)路由軌跡圖的實例

    今天小編就為大家分享一篇Python之——生成動態(tài)路由軌跡圖的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn)

    如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn)

    這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 四行Python3代碼實現(xiàn)圖片添加美顏效果

    四行Python3代碼實現(xiàn)圖片添加美顏效果

    這篇文章主要為大家介紹了如何利用Python語言實現(xiàn)給圖片添加美顏效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-04-04
  • 詳解python的幾種標準輸出重定向方式

    詳解python的幾種標準輸出重定向方式

    這篇文章是基于Python2.7版本,介紹常見的幾種標準輸出(stdout)重定向方式。顯然,這些方式也適用于標準錯誤重定向。學習python的小伙伴們可以參考借鑒。
    2016-08-08

最新評論

甘德县| 湟中县| 乌恰县| 乐至县| 武冈市| 日照市| 会泽县| 历史| 仁布县| 洪泽县| 宁晋县| 韶关市| 中超| 翁源县| 建昌县| 全椒县| 宁城县| 元阳县| 大石桥市| 温泉县| 高碑店市| 佛山市| 济阳县| 九江市| 普兰县| 都江堰市| 施秉县| 浦北县| 南投市| 板桥市| 宜黄县| 云浮市| 甘谷县| 乌拉特中旗| 铜梁县| 赤壁市| 乡宁县| 鄂伦春自治旗| 东阿县| 湘潭市| 仙居县|