/signalqueue/worker/poolqueue.py

https://github.com/fish2000/django-signalqueue
Python | 102 lines | 97 code | 0 blank | 5 comment | 0 complexity | eb87b162670a3bf272b932b01df7426a MD5 | raw file
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. poolqueue.py
  5. Internal 'pooling' of signal-dispatcher instances
  6. that the tornado worker can safely deal with.
  7. Created by FI$H 2000 on 2011-07-05.
  8. Copyright (c) 2011 OST, LLC. All rights reserved.
  9. """
  10. from tornado.ioloop import PeriodicCallback
  11. class PoolQueue(object):
  12. def __init__(self, *args, **kwargs):
  13. super(PoolQueue, self).__init__()
  14. import signalqueue
  15. signalqueue.autodiscover()
  16. from django.conf import settings as django_settings
  17. from signalqueue.utils import logg
  18. from signalqueue.worker import backends
  19. from signalqueue import SQ_RUNMODES as runmodes
  20. self.active = kwargs.get('active', True)
  21. self.halt = kwargs.get('halt', False)
  22. self.logx = kwargs.get('log_exceptions', True)
  23. self.interval = 1
  24. self.queue_name = kwargs.get('queue_name', "default")
  25. self.runmode = runmodes['SQ_ASYNC_MGMT']
  26. self.queues = backends.ConnectionHandler(django_settings.SQ_QUEUES, self.runmode)
  27. self.signalqueue = self.queues[self.queue_name]
  28. self.signalqueue.runmode = self.runmode
  29. self.logg = logg
  30. # use interval from the config if it exists
  31. interval = kwargs.get('interval', self.signalqueue.queue_interval)
  32. if interval is not None:
  33. self.interval = interval
  34. if self.interval > 0:
  35. if self.logx:
  36. if self.halt:
  37. self.shark = PeriodicCallback(self.joe_flacco, self.interval*10)
  38. else:
  39. self.shark = PeriodicCallback(self.ray_rice, self.interval*10)
  40. else:
  41. if self.halt:
  42. self.shark = PeriodicCallback(self.cueball_scratch, self.interval*10)
  43. else:
  44. self.shark = PeriodicCallback(self.cueball, self.interval*10)
  45. if self.active:
  46. self.shark.start()
  47. def stop(self):
  48. self.active = False
  49. self.shark.stop()
  50. def rerack(self):
  51. self.active = True
  52. self.shark.start()
  53. """ Non-logging cues """
  54. def cueball(self):
  55. try:
  56. self.signalqueue.dequeue()
  57. except Exception, err:
  58. self.logg.info("--- Exception during dequeue: %s" % err)
  59. def cueball_scratch(self):
  60. try:
  61. self.signalqueue.dequeue()
  62. except Exception, err:
  63. self.logg.info("--- Exception during dequeue: %s" % err)
  64. if self.signalqueue.count() < 1:
  65. self.logg.info("Queue exhausted, exiting...")
  66. raise KeyboardInterrupt
  67. """ Logging cues (using the Raven client for Sentry) """
  68. def ray_rice(self):
  69. from signalqueue.utils import log_exceptions
  70. with log_exceptions():
  71. self.signalqueue.dequeue()
  72. def joe_flacco(self):
  73. from signalqueue.utils import log_exceptions
  74. with log_exceptions():
  75. self.signalqueue.dequeue()
  76. if self.signalqueue.count() < 1:
  77. self.logg.info("Queue exhausted, exiting...")
  78. raise KeyboardInterrupt