Nav apraksta

timer.py 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """Timer for asyncio."""
  2. import asyncio
  3. class Timer:
  4. def __init__(
  5. self,
  6. timeout: float,
  7. repeat: bool,
  8. callback,
  9. callback_args=(),
  10. callback_kwargs=None,
  11. ):
  12. """
  13. An asynchronous Timer object.
  14. Parameters
  15. ----------
  16. timeout: :class:`float`:
  17. The duration for which the timer should last.
  18. repeat: :class:`bool`:
  19. Whether the timer should repeat.
  20. callback: :class:`Coroutine` or `Method` or `Function`:
  21. An `asyncio` coroutine or a regular method that will be called as soon as
  22. the timer ends.
  23. callback_args: Optional[:class:`tuple`]:
  24. The args to be passed to the callback.
  25. callback_kwargs: Optional[:class:`dict`]:
  26. The kwargs to be passed to the callback.
  27. """
  28. self._timeout = timeout
  29. self._repeat = repeat
  30. self._callback = callback
  31. self._task = asyncio.create_task(self._job())
  32. self._callback_args = callback_args
  33. if callback_kwargs is None:
  34. callback_kwargs = {}
  35. self._callback_kwargs = callback_kwargs
  36. async def _job(self):
  37. if self._repeat:
  38. while self._task.cancelled() is False:
  39. await asyncio.sleep(self._timeout)
  40. await self._call_callback()
  41. else:
  42. await asyncio.sleep(self._timeout)
  43. await self._call_callback()
  44. async def _call_callback(self):
  45. if asyncio.iscoroutine(self._callback) or asyncio.iscoroutinefunction(
  46. self._callback
  47. ):
  48. await self._callback(*self._callback_args, **self._callback_kwargs)
  49. else:
  50. self._callback(*self._callback_args, **self._callback_kwargs)
  51. def cancel(self):
  52. """Cancels the timer. The callback will not be called."""
  53. self._task.cancel()