@@ -36,16 +36,48 @@ class _Event(object):
36
36
"""An _Event represents a timer scheduled to expire in the future.
37
37
38
38
Args:
39
- time_ms: the number of ms before this event fires
39
+ delay: datetime.timedelta or number of ms before this event fires
40
40
callback: the callable to run
41
41
"""
42
- def __init__ (self , time_ms , callback ):
42
+ def __init__ (self , delay , callback ):
43
43
self ._run_at = (datetime .datetime .now () +
44
- datetime .timedelta (milliseconds = time_ms ))
44
+ (delay if isinstance (delay , datetime .timedelta )
45
+ else datetime .timedelta (milliseconds = delay )))
45
46
self ._callback = callback
46
47
47
- def __cmp__ (self , other ):
48
- return cmp (self ._run_at , other ._run_at )
48
+ def __eq__ (self , other ):
49
+ if not isinstance (other , self .__class__ ):
50
+ return False
51
+ return self ._run_at == other ._run_at and self ._callback == other ._callback
52
+
53
+ def __lt__ (self , other ):
54
+ if not isinstance (other , self .__class__ ):
55
+ return NotImplemented
56
+ if self ._run_at != other ._run_at :
57
+ return self ._run_at < other ._run_at
58
+ return self ._callback .__name__ < other ._callback .__name__
59
+
60
+ # These 4 can be replaced with functools:total_ordering when 2.6 is dropped
61
+ def __le__ (self , other ):
62
+ if not isinstance (other , self .__class__ ):
63
+ return NotImplemented
64
+ return self < other or self == other
65
+
66
+ def __gt__ (self , other ):
67
+ if not isinstance (other , self .__class__ ):
68
+ return NotImplemented
69
+ return not self <= other
70
+
71
+ def __ge__ (self , other ):
72
+ if not isinstance (other , self .__class__ ):
73
+ return NotImplemented
74
+ return not self < other
75
+
76
+ def __ne__ (self , other ):
77
+ return not self == other
78
+
79
+ def __hash__ (self ):
80
+ return hash ((self ._run_at , self ._callback ))
49
81
50
82
def TimeLeft (self , now ):
51
83
"""Get the time remaining before this event triggers.
@@ -186,8 +218,10 @@ def Run(self):
186
218
sleep_time = 1
187
219
now = datetime .datetime .now ()
188
220
self ._CheckTimeouts (now )
221
+ if self ._quit :
222
+ sleep_time = 0
189
223
if len (self ._events ):
190
- sleep_time = min (1.0 , self ._events [0 ].TimeLeft (now ))
224
+ sleep_time = min (sleep_time , self ._events [0 ].TimeLeft (now ))
191
225
192
226
i , o , e = select .select (self ._read_descriptors .keys (),
193
227
self ._write_descriptors .keys (),
@@ -204,14 +238,14 @@ def Run(self):
204
238
# descriptors).
205
239
self .RemoveReadDescriptor (self ._local_socket [0 ])
206
240
207
- def AddEvent (self , time_in_ms , callback ):
241
+ def AddEvent (self , delay , callback ):
208
242
"""Schedule an event to run in the future.
209
243
210
244
Args:
211
- time_in_ms: An interval in milliseconds when this should run.
245
+ delay: timedelta or number of ms before this event fires
212
246
callback: The function to run.
213
247
"""
214
- event = _Event (time_in_ms , callback )
248
+ event = _Event (delay , callback )
215
249
heapq .heappush (self ._events , event )
216
250
217
251
def _CheckTimeouts (self , now ):
@@ -256,9 +290,9 @@ def _DrainAndExecute(self):
256
290
257
291
258
292
class ClientWrapper (object ):
259
- def __init__ (self ):
293
+ def __init__ (self , socket = None ):
260
294
self ._ss = SelectServer ()
261
- self ._client = OlaClient ()
295
+ self ._client = OlaClient (socket )
262
296
self ._ss .AddReadDescriptor (self ._client .GetSocket (),
263
297
self ._client .SocketReady )
264
298
0 commit comments