eventutils.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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(
  27. "do_business method not implemented by %s" % self.__class__.__name__
  28. )
  29. for msg in self.do_business():
  30. self.send_to_parent(*msg)
  31. class Timer(ParentedLet):
  32. """continously sleeps some time, then send a "timer" message to parent"""
  33. def __init__(self, milliseconds, queue):
  34. ParentedLet.__init__(self, queue)
  35. self.ms = milliseconds
  36. def parent_msg(self, kind, *args):
  37. msg = ParentedLet.parent_msg(self, kind, *args)
  38. msg["period"] = self.ms
  39. return msg
  40. def do_business(self):
  41. while True:
  42. gevent.sleep(self.ms / 1000.0)
  43. yield ("timer",)