timing.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import datetime
  4. from threading import Lock
  5. import time
  6. class Timing:
  7. def __init__(self, sleep_interval=3):
  8. self.task = {}
  9. self.lock = Lock()
  10. self.sleep_interval = sleep_interval
  11. def add_task(self, task_id, name, interval, func, *args, **kwargs):
  12. """
  13. Add a timing task and schedule will execute it.
  14. :param task_id: Unique task id.
  15. :param name: Task name.
  16. :param interval: The interval between the next task execution.
  17. :param func: The function of timing task execution.
  18. :return:
  19. """
  20. if not isinstance(task_id, str):
  21. raise TypeError('task_id must be str')
  22. if not isinstance(interval, int):
  23. raise TypeError('interval must be int')
  24. if interval < 0:
  25. raise ValueError('interval must be bigger than 0')
  26. if not isinstance(func, function):
  27. raise TypeError('func must be func')
  28. self.lock.acquire()
  29. self.task[task_id] = {'name': name, 'interval': interval, 'func': func, 'args': args, 'kwargs': kwargs}
  30. self.lock.release()
  31. def delete_task(self, task_id):
  32. """
  33. Delete the task from schedule by task_id, if exist, return it.
  34. :param task_id: Unique task id.
  35. :return:
  36. """
  37. element = None
  38. self.lock.acquire()
  39. if self.task.__contains__(task_id):
  40. element = self.task.pop(task_id)
  41. self.lock.release()
  42. return element
  43. def set_interval(self, interval):
  44. self.sleep_interval = interval
  45. def sleep(self):
  46. time.sleep(self.sleep_interval)
  47. def run(self):
  48. while True:
  49. self.lock.acquire()
  50. for task_id, task_detail in self.task.keys():
  51. now = int(datetime.datetime.now().timestamp() * 1000)
  52. interval = task_detail['interval']
  53. if interval - (now % interval) > 1:
  54. continue
  55. task_detail['func']()
  56. self.lock.release()
  57. self.sleep()
  58. defaultTiming = Timing()
  59. def add_task(task_id, name, interval, func, *args, **kwargs):
  60. defaultTiming.add_task(task_id, name, interval, func, *args, **kwargs)
  61. def delete_task(task_id):
  62. defaultTiming.delete_task(task_id)
  63. def set_interval(interval):
  64. defaultTiming.set_interval(interval)
  65. def run():
  66. defaultTiming.run()