eventutils.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import gevent
  2. class ParentedLet(gevent.Greenlet):
  3. '''
  4. ParentedLet is just a helper subclass that will help you when your
  5. greenlet main duty is to "signal" things to a parent_queue.
  6. It won't save you much code, but "standardize" messages and make explicit
  7. the role of that greenlet
  8. '''
  9. def __init__(self, queue):
  10. gevent.Greenlet.__init__(self)
  11. self.parent_queue = queue
  12. self.parent_greenlet = None
  13. self.tracker = None # set this to recognize easily
  14. def parent_msg(self, kind, *args):
  15. return {
  16. 'emitter': self,
  17. 'class': self.__class__.__name__,
  18. 'tracker': self.tracker,
  19. 'kind': kind,
  20. 'args': args
  21. }
  22. def send_to_parent(self, kind, *args):
  23. self.parent_queue.put(self.parent_msg(kind, *args))
  24. def _run(self):
  25. if not hasattr(self, 'do_business'):
  26. raise Exception("do_business method not implemented by %s" %
  27. self.__class__.__name__)
  28. for msg in self.do_business():
  29. self.send_to_parent(*msg)
  30. class Timer(ParentedLet):
  31. '''continously sleeps some time, then send a "timer" message to parent'''
  32. def __init__(self, milliseconds, queue):
  33. ParentedLet.__init__(self, queue)
  34. self.ms = milliseconds
  35. def parent_msg(self, kind, *args):
  36. msg = ParentedLet.parent_msg(self, kind, *args)
  37. msg['period'] = self.ms
  38. return msg
  39. def do_business(self):
  40. while True:
  41. gevent.sleep(self.ms / 1000.0)
  42. yield ('timer', )