... | ... |
@@ -712,6 +712,46 @@ def replay_log(learner, log): |
712 | 712 |
getattr(learner, method)(*args) |
713 | 713 |
|
714 | 714 |
|
715 |
+# --- Useful runner goals |
|
716 |
+ |
|
717 |
+ |
|
718 |
+def stop_after(*, seconds=0, minutes=0, hours=0): |
|
719 |
+ """Stop a runner after a specified time. |
|
720 |
+ |
|
721 |
+ For example, to specify a runner that should stop after |
|
722 |
+ 5 minutes, one could do the following: |
|
723 |
+ |
|
724 |
+ >>> runner = Runner(learner, goal=stop_after(minutes=5)) |
|
725 |
+ |
|
726 |
+ To stop a runner after 2 hours, 10 minutes and 3 seconds, |
|
727 |
+ one could do the following: |
|
728 |
+ |
|
729 |
+ >>> runner = Runner(learner, goal=stop_after(hours=2, minutes=10, seconds=3)) |
|
730 |
+ |
|
731 |
+ Parameters |
|
732 |
+ ---------- |
|
733 |
+ seconds, minutes, hours : float, default: 0 |
|
734 |
+ If more than one is specified, then they are added together |
|
735 |
+ |
|
736 |
+ Returns |
|
737 |
+ ------- |
|
738 |
+ goal : callable |
|
739 |
+ Can be used as the ``goal`` parameter when constructing |
|
740 |
+ a `Runner`. |
|
741 |
+ |
|
742 |
+ Notes |
|
743 |
+ ----- |
|
744 |
+ The duration specified is only a *lower bound* on the time that the |
|
745 |
+ runner will run for, because the runner only checks its goal when |
|
746 |
+ it adds points to its learner |
|
747 |
+ """ |
|
748 |
+ stop_time = time.time() + seconds + 60 * minutes + 3600 * hours |
|
749 |
+ return lambda _: time.time() > stop_time |
|
750 |
+ |
|
751 |
+ |
|
752 |
+# -- Internal executor-related, things |
|
753 |
+ |
|
754 |
+ |
|
715 | 755 |
class SequentialExecutor(concurrent.Executor): |
716 | 756 |
"""A trivial executor that runs functions synchronously. |
717 | 757 |
|