当前位置:   article > 正文

python 64式: 第35式、基于cotyledon和threading.Event实现定时任务_cotyledon python

cotyledon python
  1. # -*- encoding: utf-8 -*-
  2. import abc
  3. from datetime import datetime
  4. import sys
  5. import threading
  6. import time
  7. import cotyledon
  8. from cotyledon import oslo_config_glue
  9. from oslo_config import cfg
  10. from oslo_log import log
  11. from oslo_utils import timeutils
  12. import six
  13. LOG = log.getLogger(__name__)
  14. CLEANER_OPTS = [
  15. cfg.IntOpt('workers',
  16. default=1,
  17. required=True,
  18. help="how many cleaner workers"),
  19. cfg.IntOpt('resource_cleanup_interval',
  20. default=60,
  21. required=True,
  22. help='how many seconds to wait to clean deleted resource')
  23. ]
  24. '''
  25. 参考:
  26. https://blog.csdn.net/tjcwt2011/article/details/80764765
  27. https://www.jb51.net/article/139014.htm
  28. https://blog.csdn.net/qingyuanluofeng/article/details/83869163
  29. gnocchi 3.1源码
  30. '''
  31. # cfg.CONF.register_opts(CLEANER_OPTS, group='cleaner')
  32. # import pdb
  33. #
  34. # class ForkedPdb(pdb.Pdb):
  35. # def interaction(self, *args, **kwargs):
  36. # _stdin = sys.stdin
  37. # try:
  38. # sys.stdin = open('/dev/stdin')
  39. # pdb.Pdb.interaction(self, *args, **kwargs)
  40. # finally:
  41. # sys.stdin = _stdin
  42. # @six.add_metaclass(abc.ABCMeta)
  43. class BaseCleaner(cotyledon.Service):
  44. def __init__(self, workerId, conf, interval=0):
  45. super(BaseCleaner, self).__init__(workerId)
  46. self.workerId = workerId
  47. self.interval = interval
  48. self.closeEvent = threading.Event()
  49. self.conf = conf
  50. # main entry point
  51. def run(self):
  52. time.sleep(self.workerId)
  53. while not self.closeEvent.is_set():
  54. with timeutils.StopWatch() as timer:
  55. self.process()
  56. elapsedTime = self.interval - timer.elapsed(0)
  57. timeout = max(0, elapsedTime)
  58. self.closeEvent.wait(timeout)
  59. self.closeEvent.set()
  60. @abc.abstractmethod
  61. def process(self):
  62. """ Process code """
  63. def terminate(self):
  64. self.closeEvent.set()
  65. self.closeService()
  66. @staticmethod
  67. def closeService():
  68. pass
  69. class ResourceCleaner(BaseCleaner):
  70. def __init__(self, workerId, conf):
  71. # ForkedPdb().set_trace()
  72. interval = conf.cleaner.resource_cleanup_interval
  73. super(ResourceCleaner, self).__init__(workerId, conf, interval=interval)
  74. # TODO(), add process code
  75. def process(self):
  76. info = "clean deleted resource at {curTime}".format(
  77. curTime=datetime.now()
  78. )
  79. print info
  80. class CleanerServiceManager(cotyledon.ServiceManager):
  81. def __init__(self, conf):
  82. super(CleanerServiceManager, self).__init__()
  83. #
  84. oslo_config_glue.setup(self, conf)
  85. self.conf = conf
  86. self.addService()
  87. # add service which needs to be managered
  88. def addService(self):
  89. # NOTE(), args=(self.conf,) it needs to add ','
  90. self.resourceCleanerProcessId = self.add(
  91. ResourceCleaner,
  92. args=(self.conf,),
  93. workers=self.conf.cleaner.workers)
  94. def on_reload(self):
  95. self.reconfigure(
  96. self.resourceCleanerProcessId,
  97. workers=self.conf.cleaner.workers
  98. )
  99. def run(self):
  100. super(CleanerServiceManager, self).run()
  101. def getOpts():
  102. return [
  103. ('cleaner', CLEANER_OPTS),
  104. ]
  105. def prepareService(configFile=None):
  106. conf= cfg.ConfigOpts()
  107. log.register_options(conf)
  108. log.set_defaults(default_log_levels=conf.default_log_levels)
  109. sys.argv = [sys.argv[0]]
  110. for group, options in getOpts():
  111. conf.register_opts(
  112. group=group if group else 'DEFAULT', opts=list(options))
  113. conf(None,
  114. project='gnocchi',
  115. validate_default_values=False,
  116. default_config_files=[configFile] if configFile else None)
  117. log.setup(conf, 'gnocchi')
  118. return conf
  119. def cleand():
  120. # initialize config
  121. conf = prepareService()
  122. CleanerServiceManager(conf).run()
  123. def process():
  124. cleand()
  125. if __name__ == "__main__":
  126. process()

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号