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
|
||||
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)
|
@ -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()
|
Loading…
Reference in New Issue
Block a user