-
Notifications
You must be signed in to change notification settings - Fork 0
/
serializer.py
executable file
·74 lines (60 loc) · 1.84 KB
/
serializer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python
import time
import datetime
import threading
class Serializer:
# Send packets only when channel is idle by some time
def __init__(self, idleCb, idleMinSecs, sendAllEvents=True):
self.idleMinSecs = idleMinSecs
self.idleCb = idleCb
self.dtLastSent = None
self.sendAllEvents = sendAllEvents
self.timers = []
def schedule(self, data):
tNow = time.time()
dt = 0
if self.dtLastSent is not None:
dt = int(tNow - (self.dtLastSent + self.idleMinSecs))
print 'dt', dt, 'dtLastSent', self.dtLastSent
if dt>0:
dt = 0
if dt<0:
dt = -dt
self.dtLastSent = tNow + dt
if dt>0:
print 'scheduling data', data, 'in', dt,'secs'
t = threading.Timer(dt, lambda: self.timerExpired(data))
self.timers.append(t)
t.start()
print t
print 'after timers.append', len(self.timers)
else:
self.idleCb(data)
def timerExpired(self, data):
# FIFO
t = self.timers.pop(0)
print 'TimerExpired', t, len(self.timers), 'timers actives'
#print 'after timers.pop', len(self.timers), 'timers'
self.idleCb(data)
if not self.sendAllEvents:
self.close()
def close(self):
print 'timers2del', len(self.timers)
for t in self.timers:
print 'Timer cancelled', t
t.cancel()
self.timers = []
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
def test0():
def sendCb(data):
print 'SENDCB!', data
with Serializer(sendCb, 3) as s:
s.schedule(1)
s.schedule(2)
s.schedule(3)
time.sleep(5)
if __name__ == '__main__':
test0()