Skip to content

Commit f59d38d

Browse files
committed
Add Runner.add_periodic_callback
1 parent ae44fae commit f59d38d

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

adaptive/runner.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ def goal(_):
565565

566566
self.task = self.ioloop.create_task(self._run())
567567
self.saving_task = None
568+
self.callbacks = []
568569
if in_ipynb() and not self.ioloop.is_running():
569570
warnings.warn(
570571
"The runner has been scheduled, but the asyncio "
@@ -669,6 +670,31 @@ def elapsed_time(self):
669670
end_time = time.time()
670671
return end_time - self.start_time
671672

673+
def add_periodic_callback(
674+
self,
675+
method: Callable[[AsyncRunner]],
676+
interval: int = 30,
677+
):
678+
"""Start a periodic callback that calls the given method on the runner.
679+
680+
Parameters
681+
----------
682+
method : callable
683+
The method to call periodically.
684+
interval : int
685+
The interval in seconds between the calls.
686+
"""
687+
688+
async def _callback():
689+
while self.status() == "running":
690+
method(self)
691+
await asyncio.sleep(interval)
692+
method(self) # one last time
693+
694+
task = self.ioloop.create_task(_callback())
695+
self.callbacks.append(task)
696+
return task
697+
672698
def start_periodic_saving(
673699
self,
674700
save_kwargs: dict[str, Any] | None = None,
@@ -697,6 +723,8 @@ def start_periodic_saving(
697723
... save_kwargs=dict(fname='data/test.pickle'),
698724
... interval=600)
699725
"""
726+
if self.saving_task is not None:
727+
raise RuntimeError("Already saving.")
700728

701729
def default_save(learner):
702730
learner.save(**save_kwargs)
@@ -706,13 +734,7 @@ def default_save(learner):
706734
if save_kwargs is None:
707735
raise ValueError("Must provide `save_kwargs` if method=None.")
708736

709-
async def _saver():
710-
while self.status() == "running":
711-
method(self.learner)
712-
await asyncio.sleep(interval)
713-
method(self.learner) # one last time
714-
715-
self.saving_task = self.ioloop.create_task(_saver())
737+
self.saving_task = self.add_periodic_callback(method, interval=interval)
716738
return self.saving_task
717739

718740

0 commit comments

Comments
 (0)