decorator.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. #
  3. from functools import wraps
  4. _need_registered_period_tasks = []
  5. _after_app_ready_start_tasks = []
  6. _after_app_shutdown_clean_periodic_tasks = []
  7. def add_register_period_task(task):
  8. _need_registered_period_tasks.append(task)
  9. def get_register_period_tasks():
  10. return _need_registered_period_tasks
  11. def add_after_app_shutdown_clean_task(name):
  12. _after_app_shutdown_clean_periodic_tasks.append(name)
  13. def get_after_app_shutdown_clean_tasks():
  14. return _after_app_shutdown_clean_periodic_tasks
  15. def add_after_app_ready_task(name):
  16. _after_app_ready_start_tasks.append(name)
  17. def get_after_app_ready_tasks():
  18. return _after_app_ready_start_tasks
  19. def register_as_period_task(
  20. crontab=None, interval=None, name=None,
  21. args=(), kwargs=None,
  22. description=''):
  23. """
  24. Warning: Task must have not any args and kwargs
  25. :param crontab: "* * * * *"
  26. :param interval: 60*60*60
  27. :param args: ()
  28. :param kwargs: {}
  29. :param description: "
  30. :param name: ""
  31. :return:
  32. """
  33. if crontab is None and interval is None:
  34. raise SyntaxError("Must set crontab or interval one")
  35. def decorate(func):
  36. if crontab is None and interval is None:
  37. raise SyntaxError("Interval and crontab must set one")
  38. # Because when this decorator run, the task was not created,
  39. # So we can't use func.name
  40. task = '{func.__module__}.{func.__name__}'.format(func=func)
  41. _name = name if name else task
  42. add_register_period_task({
  43. _name: {
  44. 'task': task,
  45. 'interval': interval,
  46. 'crontab': crontab,
  47. 'args': args,
  48. 'kwargs': kwargs if kwargs else {},
  49. 'description': description
  50. }
  51. })
  52. @wraps(func)
  53. def wrapper(*args, **kwargs):
  54. return func(*args, **kwargs)
  55. return wrapper
  56. return decorate
  57. def after_app_ready_start(func):
  58. # Because when this decorator run, the task was not created,
  59. # So we can't use func.name
  60. name = '{func.__module__}.{func.__name__}'.format(func=func)
  61. if name not in _after_app_ready_start_tasks:
  62. add_after_app_ready_task(name)
  63. @wraps(func)
  64. def decorate(*args, **kwargs):
  65. return func(*args, **kwargs)
  66. return decorate
  67. def after_app_shutdown_clean_periodic(func):
  68. # Because when this decorator run, the task was not created,
  69. # So we can't use func.name
  70. name = '{func.__module__}.{func.__name__}'.format(func=func)
  71. if name not in _after_app_shutdown_clean_periodic_tasks:
  72. add_after_app_shutdown_clean_task(name)
  73. @wraps(func)
  74. def decorate(*args, **kwargs):
  75. return func(*args, **kwargs)
  76. return decorate