44from typing import Callable , Tuple , TypeVar , Dict , Any
55import functools
66import threading
7+ from sched import scheduler
78
89
910TEntry = TypeVar ("TEntry" ) # type of scheduler entry
@@ -25,12 +26,9 @@ def add(self, delay: float, callback, args=(), kwargs=None) -> TEntry:
2526 def cancel (self , entry : TEntry ):
2627 """Cancel a scheduled callback
2728
28- :param entry: the scheduler entry to be canceld
29+ :param entry: the scheduler entry to be canceled
2930 """
3031
31- def start (self ):
32- """Start scheduling"""
33-
3432 @abstractproperty
3533 def lock (self ):
3634 """A global lock which can be used the assure thread safety"""
@@ -57,6 +55,34 @@ def lock(self):
5755 return self ._lock
5856
5957
58+ class SyncScheduler (AbstractScheduler ):
59+ def __init__ (self , lock : threading .Lock = None ):
60+ if lock is None :
61+ lock = threading .Lock ()
62+ self ._lock = lock
63+ self ._sched = scheduler ()
64+ self ._wake_up = threading .Event ()
65+
66+ def add (self , delay : float , callback , args = (), kwargs = None ) -> asyncio .TimerHandle :
67+ if kwargs == None :
68+ kwargs = {}
69+ self ._wake_up .set ()
70+ return self ._sched .enter (delay , 0 , callback , args , kwargs )
71+
72+ def cancel (self , entry ):
73+ self ._sched .cancel (entry )
74+
75+ def run (self ):
76+ while True :
77+ self ._sched .run ()
78+ self ._wake_up .wait ()
79+ self ._wake_up .clear ()
80+
81+ @property
82+ def lock (self ):
83+ return self ._lock
84+
85+
6086class VirtualScheduler (AbstractScheduler ):
6187 @dataclass
6288 class Entry :
0 commit comments