完善 rpc 通信 server;将判题限制在一个容器中

This commit is contained in:
virusdefender 2015-11-29 01:05:29 +08:00
parent d8966ed48a
commit 3e3770f669
2 changed files with 34 additions and 13 deletions

View File

@ -1,14 +1,12 @@
# coding=utf-8
import sys
import json
import MySQLdb
import os
import shutil
from client import JudgeClient
from language import languages
from compiler import compile_
from result import result
from settings import judger_workspace, submission_db
from logger import logger
from settings import judger_workspace
class JudgeInstanceRunner(object):
@ -17,16 +15,26 @@ class JudgeInstanceRunner(object):
def run(self, submission_id, language_code, code, time_limit, memory_limit, test_case_id):
language = languages[language_code]
judge_base_path = os.path.join(judger_workspace, "run", submission_id)
try:
os.mkdir(judge_base_path)
# 将代码写入文件
src_path = judger_workspace + "run/" + submission_id + "/" + language["src_name"]
src_path = os.path.join(judge_base_path, language["src_name"])
f = open(src_path, "w")
f.write(code.encode("utf8"))
f.close()
except Exception as e:
shutil.rmtree(judge_base_path, ignore_errors=True)
return {"code": 2, "data": str(e)}
# 编译
try:
exe_path = compile_(language, src_path, judger_workspace + "run/" + submission_id + "/")
exe_path = compile_(language, src_path, judge_base_path)
except Exception as e:
shutil.rmtree(judge_base_path, ignore_errors=True)
return {"code": 1, "data": str(e)}
# 运行
@ -47,6 +55,7 @@ class JudgeInstanceRunner(object):
l = sorted(judge_result["info"], key=lambda k: k["cpu_time"])
judge_result["accepted_answer_time"] = l[-1]["cpu_time"]
return {"code": 0, "data": judge_result}
except Exception as e:
return {"code": 1, "data": str(e)}
return {"code": 2, "data": str(e)}
finally:
shutil.rmtree(judge_base_path, ignore_errors=True)

View File

@ -1 +1,13 @@
# coding=utf-8
import SocketServer
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from runner import JudgeInstanceRunner
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer):
pass
server = AsyncXMLRPCServer(('0.0.0.0', 8080), SimpleXMLRPCRequestHandler, allow_none=True)
server.register_instance(JudgeInstanceRunner())
server.serve_forever()