]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Optionally accept a timedelta in PeriodicCallback
authorMichael V. DePalatis <mike@depalatis.net>
Wed, 5 May 2021 15:53:49 +0000 (09:53 -0600)
committerMichael V. DePalatis <mike@depalatis.net>
Wed, 5 May 2021 15:53:49 +0000 (09:53 -0600)
tornado/ioloop.py
tornado/test/ioloop_test.py

index 2cf884450cd5c8ec4e9af12116793b84b870b796..fff29cefb148792f27a976cde7d568249022884b 100644 (file)
@@ -864,12 +864,18 @@ class PeriodicCallback(object):
     """
 
     def __init__(
-        self, callback: Callable[[], None], callback_time: float, jitter: float = 0
+        self,
+        callback: Callable[[], None],
+        callback_time: Union[datetime.timedelta, float],
+        jitter: float = 0,
     ) -> None:
         self.callback = callback
-        if callback_time <= 0:
-            raise ValueError("Periodic callback must have a positive callback_time")
-        self.callback_time = callback_time
+        if isinstance(callback_time, datetime.timedelta):
+            self.callback_time = callback_time / datetime.timedelta(milliseconds=1)
+        else:
+            if callback_time <= 0:
+                raise ValueError("Periodic callback must have a positive callback_time")
+            self.callback_time = callback_time
         self.jitter = jitter
         self._running = False
         self._timeout = None  # type: object
index 16848b38d2c0a1a0943b3c9afc824ae3616daabc..daf74f9be5cd43547e67d1a73eb4e9721a802d0c 100644 (file)
@@ -688,6 +688,11 @@ class TestPeriodicCallbackMath(unittest.TestCase):
         with mock.patch("random.random", mock_random):
             self.assertEqual(self.simulate_calls(pc, call_durations), expected)
 
+    def test_timedelta(self):
+        pc = PeriodicCallback(lambda: None, datetime.timedelta(minutes=1, seconds=23))
+        expected_callback_time = 83000
+        self.assertEqual(pc.callback_time, expected_callback_time)
+
 
 class TestIOLoopConfiguration(unittest.TestCase):
     def run_python(self, *statements):