From 3e3770f6695ff14e7137371c3b9d9eea7ba587d8 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 29 Nov 2015 01:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20rpc=20=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=20server=EF=BC=9B=E5=B0=86=E5=88=A4=E9=A2=98=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=9C=A8=E4=B8=80=E4=B8=AA=E5=AE=B9=E5=99=A8=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/{run.py => runner.py} | 35 ++++++++++++++++++++++------------- judge/server.py | 12 ++++++++++++ 2 files changed, 34 insertions(+), 13 deletions(-) rename judge/{run.py => runner.py} (64%) diff --git a/judge/run.py b/judge/runner.py similarity index 64% rename from judge/run.py rename to judge/runner.py index 2118521a..49b1ea9d 100644 --- a/judge/run.py +++ b/judge/runner.py @@ -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] - # 将代码写入文件 - src_path = judger_workspace + "run/" + submission_id + "/" + language["src_name"] - f = open(src_path, "w") - f.write(code.encode("utf8")) - f.close() + + judge_base_path = os.path.join(judger_workspace, "run", submission_id) + + try: + os.mkdir(judge_base_path) + + # 将代码写入文件 + 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)} \ No newline at end of file + return {"code": 2, "data": str(e)} + finally: + shutil.rmtree(judge_base_path, ignore_errors=True) \ No newline at end of file diff --git a/judge/server.py b/judge/server.py index 9bad5790..477cc1e4 100644 --- a/judge/server.py +++ b/judge/server.py @@ -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() \ No newline at end of file