25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

46 lines
1.1 KiB

  1. from __future__ import annotations
  2. import time
  3. __all__ = ["Deadline"]
  4. class Deadline:
  5. """
  6. Manage timeouts across multiple steps.
  7. Args:
  8. timeout: Time available in seconds or :obj:`None` if there is no limit.
  9. """
  10. def __init__(self, timeout: float | None) -> None:
  11. self.deadline: float | None
  12. if timeout is None:
  13. self.deadline = None
  14. else:
  15. self.deadline = time.monotonic() + timeout
  16. def timeout(self, *, raise_if_elapsed: bool = True) -> float | None:
  17. """
  18. Calculate a timeout from a deadline.
  19. Args:
  20. raise_if_elapsed: Whether to raise :exc:`TimeoutError`
  21. if the deadline lapsed.
  22. Raises:
  23. TimeoutError: If the deadline lapsed.
  24. Returns:
  25. Time left in seconds or :obj:`None` if there is no limit.
  26. """
  27. if self.deadline is None:
  28. return None
  29. timeout = self.deadline - time.monotonic()
  30. if raise_if_elapsed and timeout <= 0:
  31. raise TimeoutError("timed out")
  32. return timeout