working workers in browser

This commit is contained in:
Barak Michener 2020-12-04 20:45:19 -08:00
parent 56116aea2a
commit 715f79c9c0
13 changed files with 343 additions and 28 deletions

View file

@ -1,8 +1,18 @@
from js import XMLHttpRequest, Blob
import js
import json
import base64
import cloudpickle
import ray.webpb as webpb
def b64dumps(b):
return base64.standard_b64encode(b).decode()
def b64loads(s):
return base64.standard_b64decode(s)
def get(get_id):
@ -38,3 +48,46 @@ def schedule(task):
out = json.loads(req.response)
out_id = base64.standard_b64decode(out["return_id"])
return out_id
WORK_COMPLETE = 0
WORK_ERROR = 1
WORK_READY = 2
FUNCTION = webpb.ClientTaskType.FUNCTION.value
def exec_work(work_blob):
work = json.loads(work_blob)
js.console.log("Got work")
task = work["task"]
if "type" in task and task["type"] != FUNCTION:
return json.dumps({
"status": WORK_ERROR,
"error_msg": "Unsupported",
})
args = decode_json_args(task)
getresp = get(b64loads(task["payload_id"]))
func = webpb.loads(getresp["data"])
res = func(*args)
out_data = cloudpickle.dumps(res)
workstatus = {
"status": WORK_COMPLETE,
"complete_data": b64dumps(out_data),
"finished_ticket": work["ticket"],
}
return json.dumps(workstatus)
def decode_json_args(task):
out = []
for arg in task["args"]:
if "local" in arg and arg["local"] == webpb.Locality.REFERENCE.value:
getresp = get(b64loads(arg["reference_id"]))
data = webpb.loads(getresp["data"])
out.append(data)
elif "local" not in arg or arg["local"] == webpb.Locality.INTERNED.value:
out.append(webpb.loads(arg["data"]))
else:
raise Exception("convert_from_arg: Uncovered locality enum")
return out