artiq/artiq/master/worker_impl.py

119 lines
3.3 KiB
Python
Raw Normal View History

import sys
import time
from artiq.protocols import pyon
from artiq.tools import file_import
2015-02-22 05:28:18 +08:00
from artiq.master.worker_db import DBHub, ResultDB
from artiq.master.results import get_hdf5_output
2014-12-31 17:41:22 +08:00
def get_object():
line = sys.__stdin__.readline()
return pyon.decode(line)
def put_object(obj):
2014-10-25 16:31:34 +08:00
ds = pyon.encode(obj)
sys.__stdout__.write(ds)
sys.__stdout__.write("\n")
sys.__stdout__.flush()
2015-01-07 17:50:05 +08:00
class ParentActionError(Exception):
pass
2014-12-31 17:41:22 +08:00
2015-01-07 17:50:05 +08:00
def make_parent_action(action, argnames, exception=ParentActionError):
argnames = argnames.split()
def parent_action(*args):
request = {"action": action}
for argname, arg in zip(argnames, args):
request[argname] = arg
put_object(request)
reply = get_object()
if reply["status"] == "ok":
return reply["data"]
else:
raise exception(reply["message"])
2015-01-07 17:50:05 +08:00
return parent_action
class ParentDDB:
request = make_parent_action("req_device", "name", KeyError)
class ParentPDB:
request = make_parent_action("req_parameter", "name", KeyError)
set = make_parent_action("set_parameter", "name value")
2014-12-31 17:41:22 +08:00
2015-01-14 11:37:08 +08:00
init_rt_results = make_parent_action("init_rt_results", "description")
update_rt_results = make_parent_action("update_rt_results", "mod")
2015-01-13 19:12:19 +08:00
class Scheduler:
run_queued = make_parent_action("scheduler_run_queued", "run_params")
cancel_queued = make_parent_action("scheduler_cancel_queued", "rid")
run_timed = make_parent_action("scheduler_run_timed",
"run_params next_run")
cancel_timed = make_parent_action("scheduler_cancel_timed", "trid")
def get_exp(file, exp):
2015-01-13 19:12:19 +08:00
module = file_import(file)
if exp is None:
exps = [v for k, v in module.__dict__.items()
if is_experiment(v)]
if len(exps) != 1:
raise ValueError("Found {} experiments in module"
.format(len(exps)))
return exps[0]
2015-01-13 19:12:19 +08:00
else:
return getattr(module, exp)
2015-01-13 19:12:19 +08:00
def main():
sys.stdout = sys.stderr
start_time = None
rid = None
run_params = None
exp = None
exp_inst = None
2015-01-13 19:12:19 +08:00
rdb = ResultDB(init_rt_results, update_rt_results)
2015-01-13 19:12:19 +08:00
dbh = DBHub(ParentDDB, ParentPDB, rdb)
try:
while True:
obj = get_object()
action = obj["action"]
if action == "prepare":
start_time = time.localtime()
rid = obj["rid"]
run_params = obj["run_params"]
exp = get_exp(run_params["file"], run_params["experiment"])
exp_inst = exp(dbh,
scheduler=Scheduler,
run_params=run_params,
**run_params["arguments"])
put_object({"action": "completed"})
elif action == "run":
exp_inst.run()
put_object({"action": "completed"})
elif action == "analyze":
exp_inst.analyze()
f = get_hdf5_output(start_time, rid, exp.__name__)
try:
rdb.write_hdf5(f)
finally:
f.close()
put_object({"action": "completed"})
elif action == "terminate":
break
finally:
dbh.close()
if __name__ == "__main__":
main()