mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +00:00
完善 rpc 通信 server;将判题限制在一个容器中
This commit is contained in:
parent
d8966ed48a
commit
3e3770f669
@ -1,14 +1,12 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
import sys
|
import os
|
||||||
import json
|
import shutil
|
||||||
import MySQLdb
|
|
||||||
|
|
||||||
from client import JudgeClient
|
from client import JudgeClient
|
||||||
from language import languages
|
from language import languages
|
||||||
from compiler import compile_
|
from compiler import compile_
|
||||||
from result import result
|
from result import result
|
||||||
from settings import judger_workspace, submission_db
|
from settings import judger_workspace
|
||||||
from logger import logger
|
|
||||||
|
|
||||||
|
|
||||||
class JudgeInstanceRunner(object):
|
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):
|
def run(self, submission_id, language_code, code, time_limit, memory_limit, test_case_id):
|
||||||
language = languages[language_code]
|
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 = open(src_path, "w")
|
||||||
f.write(code.encode("utf8"))
|
f.write(code.encode("utf8"))
|
||||||
f.close()
|
f.close()
|
||||||
|
except Exception as e:
|
||||||
|
shutil.rmtree(judge_base_path, ignore_errors=True)
|
||||||
|
return {"code": 2, "data": str(e)}
|
||||||
|
|
||||||
# 编译
|
# 编译
|
||||||
try:
|
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:
|
except Exception as e:
|
||||||
|
shutil.rmtree(judge_base_path, ignore_errors=True)
|
||||||
return {"code": 1, "data": str(e)}
|
return {"code": 1, "data": str(e)}
|
||||||
|
|
||||||
# 运行
|
# 运行
|
||||||
@ -47,6 +55,7 @@ class JudgeInstanceRunner(object):
|
|||||||
l = sorted(judge_result["info"], key=lambda k: k["cpu_time"])
|
l = sorted(judge_result["info"], key=lambda k: k["cpu_time"])
|
||||||
judge_result["accepted_answer_time"] = l[-1]["cpu_time"]
|
judge_result["accepted_answer_time"] = l[-1]["cpu_time"]
|
||||||
return {"code": 0, "data": judge_result}
|
return {"code": 0, "data": judge_result}
|
||||||
|
|
||||||
except Exception as e:
|
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)
|
@ -1 +1,13 @@
|
|||||||
# coding=utf-8
|
# 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()
|
Loading…
Reference in New Issue
Block a user