Source code for subway.workflow
"""
Main loop function for subway entry_point
"""
import time
import sys
from .exceptions import EndingBubble
[docs]def main_once(checker, submitter):
"""
main entry point run checker and submitter once.
:param checker: Checker.
:param submitter: Submitter.
:return: None
"""
######
# check part
######
print("------begin checker------")
checker()
######
# submit part
######
print("------begin submitter------")
submitter()
[docs]def main_rt(
checker,
submitter,
preprocessor=None,
postprocessor=None,
sleep_interval=10,
loops=None,
):
"""
realtime main monitor for subway entry_point
:param checker: Checker.
:param submitter: Submitter.
:param preprocessor: Optional[Processor]. Run before the main loop.
:param postprocessor: Optional[Processor]. Run after the main loop.
:param sleep_interval: Optional[Union[float, Tuple[float, float]]], default 10.
There are two intervals, one after checker, one after submitter.
If one number is given, then two intervals are the same.
If tuple or list of 2 numbers are given, they are explained as
(after_checker_interval, after_submitter_interval)
:param loops: Optional[int], default None.
max loops before exit, none for running forever,
but the monitor can still quit if no job is running as expected.
:return: None
"""
# TODO: better way for realtime always-on monitor version of main?
i = 0
if isinstance(sleep_interval, tuple) or isinstance(sleep_interval, list):
after_checker_interval, after_submitter_interval = sleep_interval
else:
after_checker_interval = after_submitter_interval = sleep_interval
if preprocessor:
preprocessor()
try:
while (not loops) or (i < loops):
print("------begin checker------")
checker()
time.sleep(after_checker_interval)
print("------begin submitter------")
submitter()
time.sleep(after_submitter_interval)
i += 1
except KeyboardInterrupt as e:
print("Quit the main monitor", file=sys.stderr)
except EndingBubble:
print("No active jobs anymore, quitting", file=sys.stderr)
finally:
if postprocessor:
postprocessor()