1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from twisted.internet import reactor, defer
20 from twisted.python import log
21
23
24 _reactor = reactor
25
27 self._events = []
28 self._flushObservers = []
29 self._timer = None
30 self._in_turn = False
31
32 - def append(self, cb, args, kwargs):
33 self._events.append((cb, args, kwargs))
34 if not self._timer:
35 self._timer = self._reactor.callLater(0, self._turn)
36
38 self._timer = None
39 self._in_turn = True
40
41
42
43 events, self._events = self._events, []
44 for cb, args, kwargs in events:
45 try:
46 cb(*args, **kwargs)
47 except:
48 log.err()
49 self._in_turn = False
50 if self._events and not self._timer:
51 self._timer = self._reactor.callLater(0, self._turn)
52 if not self._events:
53 observers, self._flushObservers = self._flushObservers, []
54 for o in observers:
55 o.callback(None)
56
58 if not self._events and not self._in_turn:
59 return defer.succeed(None)
60 d = defer.Deferred()
61 self._flushObservers.append(d)
62 return d
63
64
65 _theSimpleQueue = _SimpleCallQueue()
66
69
70
72 d = defer.Deferred()
73 eventually(d.callback, value)
74 return d
75
78
86