Eventlet Timer.
| 34 | |
| 35 | |
| 36 | class Timer(_timer.Timer): |
| 37 | """Eventlet Timer.""" |
| 38 | |
| 39 | def __init__(self, *args, **kwargs): |
| 40 | from eventlet.greenthread import spawn_after |
| 41 | from greenlet import GreenletExit |
| 42 | super().__init__(*args, **kwargs) |
| 43 | |
| 44 | self.GreenletExit = GreenletExit |
| 45 | self._spawn_after = spawn_after |
| 46 | self._queue = set() |
| 47 | |
| 48 | def _enter(self, eta, priority, entry, **kwargs): |
| 49 | secs = max(eta - monotonic(), 0) |
| 50 | g = self._spawn_after(secs, entry) |
| 51 | self._queue.add(g) |
| 52 | g.link(self._entry_exit, entry) |
| 53 | g.entry = entry |
| 54 | g.eta = eta |
| 55 | g.priority = priority |
| 56 | g.canceled = False |
| 57 | return g |
| 58 | |
| 59 | def _entry_exit(self, g, entry): |
| 60 | try: |
| 61 | try: |
| 62 | g.wait() |
| 63 | except self.GreenletExit: |
| 64 | entry.cancel() |
| 65 | g.canceled = True |
| 66 | finally: |
| 67 | self._queue.discard(g) |
| 68 | |
| 69 | def clear(self): |
| 70 | queue = self._queue |
| 71 | while queue: |
| 72 | try: |
| 73 | queue.pop().cancel() |
| 74 | except (KeyError, self.GreenletExit): |
| 75 | pass |
| 76 | |
| 77 | def cancel(self, tref): |
| 78 | try: |
| 79 | tref.cancel() |
| 80 | except self.GreenletExit: |
| 81 | pass |
| 82 | |
| 83 | @property |
| 84 | def queue(self): |
| 85 | return self._queue |
| 86 | |
| 87 | |
| 88 | class TaskPool(base.BasePool): |
no outgoing calls