added schedule_call_global function to hub (uncancellable timer) and schedule_call_local (alias for schedule_call)

This commit is contained in:
Denis Bilenko
2008-11-24 14:18:42 +06:00
parent e68d6aad55
commit 5d8f728a10
4 changed files with 34 additions and 11 deletions

View File

@@ -241,9 +241,10 @@ class BaseHub(object):
# the 0 placeholder makes it easy to bisect_right using (now, 1) # the 0 placeholder makes it easy to bisect_right using (now, 1)
self.next_timers.append((when, 0, info)) self.next_timers.append((when, 0, info))
def add_timer(self, timer): def add_timer(self, timer, track=True):
scheduled_time = self.clock() + timer.seconds scheduled_time = self.clock() + timer.seconds
self._add_absolute_timer(scheduled_time, timer) self._add_absolute_timer(scheduled_time, timer)
if track:
self.track_timer(timer) self.track_timer(timer)
return scheduled_time return scheduled_time
@@ -259,7 +260,7 @@ class BaseHub(object):
del self.timers_by_greenlet[timer.greenlet][timer] del self.timers_by_greenlet[timer.greenlet][timer]
if not self.timers_by_greenlet[timer.greenlet]: if not self.timers_by_greenlet[timer.greenlet]:
del self.timers_by_greenlet[timer.greenlet] del self.timers_by_greenlet[timer.greenlet]
except KeyError: except (KeyError, AttributeError):
pass pass
def timer_canceled(self, timer): def timer_canceled(self, timer):
@@ -272,16 +273,30 @@ class BaseHub(object):
ins(t, item) ins(t, item)
del self.next_timers[:] del self.next_timers[:]
def schedule_call(self, seconds, cb, *args, **kw): def schedule_call_local(self, seconds, cb, *args, **kw):
"""Schedule a callable to be called after 'seconds' seconds have """Schedule a callable to be called after 'seconds' seconds have
elapsed. elapsed. Cancel the timer if greenlet has exited.
seconds: The number of seconds to wait. seconds: The number of seconds to wait.
cb: The callable to call after the given time. cb: The callable to call after the given time.
*args: Arguments to pass to the callable when called. *args: Arguments to pass to the callable when called.
**kw: Keyword arguments to pass to the callable when called. **kw: Keyword arguments to pass to the callable when called.
""" """
t = Timer(seconds, cb, *args, **kw) t = Timer(seconds, cb, *args, **kw)
self.add_timer(t) self.add_timer(t, track=True)
return t
schedule_call = schedule_call_local
def schedule_call_global(self, seconds, cb, *args, **kw):
"""Schedule a callable to be called after 'seconds' seconds have
elapsed. The timer will NOT
seconds: The number of seconds to wait.
cb: The callable to call after the given time.
*args: Arguments to pass to the callable when called.
**kw: Keyword arguments to pass to the callable when called.
"""
t = Timer(seconds, cb, *args, **kw)
self.add_timer(t, track=False)
return t return t
def fire_timers(self, when): def fire_timers(self, when):

View File

@@ -113,11 +113,12 @@ class Hub(hub.BaseHub):
self.interrupted = False self.interrupted = False
raise KeyboardInterrupt() raise KeyboardInterrupt()
def add_timer(self, timer): def add_timer(self, timer, track=True):
# store the pyevent timer object so that we can cancel later # store the pyevent timer object so that we can cancel later
eventtimer = libev.Timer(timer.seconds, 0, self._evloop, timer) eventtimer = libev.Timer(timer.seconds, 0, self._evloop, timer)
timer.impltimer = eventtimer timer.impltimer = eventtimer
eventtimer.start() eventtimer.start()
if track:
self.track_timer(timer) self.track_timer(timer)
def timer_finished(self, timer): def timer_finished(self, timer):

View File

@@ -118,11 +118,12 @@ class Hub(hub.BaseHub):
self.interrupted = False self.interrupted = False
raise KeyboardInterrupt() raise KeyboardInterrupt()
def add_timer(self, timer): def add_timer(self, timer, track=True):
# store the pyevent timer object so that we can cancel later # store the pyevent timer object so that we can cancel later
eventtimer = event.timeout(timer.seconds, timer) eventtimer = event.timeout(timer.seconds, timer)
timer.impltimer = eventtimer timer.impltimer = eventtimer
eventtimer.add() eventtimer.add()
if track:
self.track_timer(timer) self.track_timer(timer)
def timer_finished(self, timer): def timer_finished(self, timer):

View File

@@ -111,7 +111,7 @@ class BaseTwistedHub(object):
def exc_descriptor(self, _fileno): def exc_descriptor(self, _fileno):
pass # XXX do something sensible here pass # XXX do something sensible here
def schedule_call(self, seconds, func, *args, **kwargs): def schedule_call_local(self, seconds, func, *args, **kwargs):
from twisted.internet import reactor from twisted.internet import reactor
def call_with_timer_attached(*args1, **kwargs1): def call_with_timer_attached(*args1, **kwargs1):
try: try:
@@ -124,6 +124,12 @@ class BaseTwistedHub(object):
self.track_timer(timer) self.track_timer(timer)
return timer return timer
schedule_call = schedule_call_local
def schedule_call_global(self, seconds, func, *args, **kwargs):
from twisted.internet import reactor
return callLater(reactor, seconds, func, *args, **kwargs)
def track_timer(self, timer): def track_timer(self, timer):
try: try:
current_greenlet = greenlet.getcurrent() current_greenlet = greenlet.getcurrent()