From cb7dd2f820257b51946fa8f389ce34fa69b5f21e Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sat, 15 Aug 2015 14:50:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A4=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {judger => judge/judger}/__init__.py | 0 {judger => judge/judger}/client.py | 0 {judger => judge/judger}/compiler.py | 0 {judger => judge/judger}/judge_exceptions.py | 0 {judger => judge/judger}/language.py | 0 {judger => judge/judger}/result.py | 0 {judger => judge/judger}/run.py | 10 +++--- {judger => judge/judger}/settings.py | 7 +---- {judger => judge/judger}/utils.py | 0 .../judger_controller}/README.md | 0 .../judger_controller}/__init__.py | 0 .../judger_controller}/celery.py | 2 +- judge/judger_controller/settings.py | 25 +++++++++++++++ judge/judger_controller/tasks.py | 31 +++++++++++++++++++ judger_controller/settings.py | 6 ---- judger_controller/tasks.py | 20 ------------ submission/views.py | 4 +-- 17 files changed, 66 insertions(+), 39 deletions(-) rename {judger => judge/judger}/__init__.py (100%) rename {judger => judge/judger}/client.py (100%) rename {judger => judge/judger}/compiler.py (100%) rename {judger => judge/judger}/judge_exceptions.py (100%) rename {judger => judge/judger}/language.py (100%) rename {judger => judge/judger}/result.py (100%) rename {judger => judge/judger}/run.py (93%) rename {judger => judge/judger}/settings.py (84%) rename {judger => judge/judger}/utils.py (100%) rename {judger_controller => judge/judger_controller}/README.md (100%) rename {judger_controller => judge/judger_controller}/__init__.py (100%) rename {judger_controller => judge/judger_controller}/celery.py (85%) create mode 100644 judge/judger_controller/settings.py create mode 100644 judge/judger_controller/tasks.py delete mode 100644 judger_controller/settings.py delete mode 100644 judger_controller/tasks.py diff --git a/judger/__init__.py b/judge/judger/__init__.py similarity index 100% rename from judger/__init__.py rename to judge/judger/__init__.py diff --git a/judger/client.py b/judge/judger/client.py similarity index 100% rename from judger/client.py rename to judge/judger/client.py diff --git a/judger/compiler.py b/judge/judger/compiler.py similarity index 100% rename from judger/compiler.py rename to judge/judger/compiler.py diff --git a/judger/judge_exceptions.py b/judge/judger/judge_exceptions.py similarity index 100% rename from judger/judge_exceptions.py rename to judge/judger/judge_exceptions.py diff --git a/judger/language.py b/judge/judger/language.py similarity index 100% rename from judger/language.py rename to judge/judger/language.py diff --git a/judger/result.py b/judge/judger/result.py similarity index 100% rename from judger/result.py rename to judge/judger/result.py diff --git a/judger/run.py b/judge/judger/run.py similarity index 93% rename from judger/run.py rename to judge/judger/run.py index d14fc617..f93a4f84 100644 --- a/judger/run.py +++ b/judge/judger/run.py @@ -1,5 +1,6 @@ # coding=utf-8 import sys +import os import pymongo from bson.objectid import ObjectId @@ -8,7 +9,11 @@ from client import JudgeClient from language import languages from compiler import compile_ from result import result -from settings import judger_workspace, mongodb_config +from settings import judger_workspace + +sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..')) + +from judger_controller.settings import mongodb_config # 简单的解析命令行参数 @@ -76,6 +81,3 @@ connection = pymongo.MongoClient(host=mongodb_config["host"], port=mongodb_confi collection = connection["oj"]["oj_submission"] collection.find_one_and_update({"_id": ObjectId(submission_id)}, {"$set": judge_result}) connection.close() - - - diff --git a/judger/settings.py b/judge/judger/settings.py similarity index 84% rename from judger/settings.py rename to judge/judger/settings.py index b70f4543..6670e362 100644 --- a/judger/settings.py +++ b/judge/judger/settings.py @@ -14,9 +14,4 @@ lrun_gid = 1002 # judger工作目录 judger_workspace = "/var/judger/" -mongodb_config = { - "host": "192.168.59.3", - "username": "root", - "password": "root", - "port": 27017 -} + diff --git a/judger/utils.py b/judge/judger/utils.py similarity index 100% rename from judger/utils.py rename to judge/judger/utils.py diff --git a/judger_controller/README.md b/judge/judger_controller/README.md similarity index 100% rename from judger_controller/README.md rename to judge/judger_controller/README.md diff --git a/judger_controller/__init__.py b/judge/judger_controller/__init__.py similarity index 100% rename from judger_controller/__init__.py rename to judge/judger_controller/__init__.py diff --git a/judger_controller/celery.py b/judge/judger_controller/celery.py similarity index 85% rename from judger_controller/celery.py rename to judge/judger_controller/celery.py index 35ba2ac0..6befedf9 100644 --- a/judger_controller/celery.py +++ b/judge/judger_controller/celery.py @@ -7,4 +7,4 @@ app = Celery("judge", broker="redis://" + redis_config["host"] + ":" + str(redis_config["port"]) + "/" + str(redis_config["db"]), - include=["judger_controller.tasks"]) + include=["judge.judger_controller.tasks"]) diff --git a/judge/judger_controller/settings.py b/judge/judger_controller/settings.py new file mode 100644 index 00000000..74761497 --- /dev/null +++ b/judge/judger_controller/settings.py @@ -0,0 +1,25 @@ +# coding=utf-8 +redis_config = { + "host": "127.0.0.1", + "port": 6379, + "db": 0 +} + + +docker_config = { + "image_name": "judger", + "docker_path": "docker", + "shell": True +} + + +test_case_dir = "/Users/virusdefender/Desktop/test_case/" +source_code_dir = "/Users/virusdefender/Desktop/" + + +mongodb_config = { + "host": "192.168.59.3", + "username": "root", + "password": "root", + "port": 27017 +} \ No newline at end of file diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py new file mode 100644 index 00000000..eee51910 --- /dev/null +++ b/judge/judger_controller/tasks.py @@ -0,0 +1,31 @@ +# coding=utf-8 +# from __future__ import absolute_import +import pymongo +from bson import ObjectId +import subprocess32 as subprocess +from ..judger.result import result +from ..judger_controller.celery import app +from settings import docker_config, source_code_dir, test_case_dir, mongodb_config + + +@app.task +def judge(submission_id, time_limit, memory_limit, test_case_id): + try: + command = "%s run -t -i --privileged --rm=true " \ + "-v %s:/var/judger/test_case/ " \ + "-v %s:/var/judger/code/ " \ + "%s " \ + "python judge/judger/run.py " \ + "--solution_id %s --time_limit %s --memory_limit %s --test_case_id %s" % \ + (docker_config["docker_path"], + test_case_dir, + source_code_dir, + docker_config["image_name"], + submission_id, str(time_limit), str(memory_limit), test_case_id) + subprocess.call(command, timeout=(time_limit / 1000.0 * 10), shell=docker_config["shell"]) + except Exception as e: + connection = pymongo.MongoClient(host=mongodb_config["host"], port=mongodb_config["port"]) + collection = connection["oj"]["oj_submission"] + data = {"result": result["system_error"], "info": str(e)} + collection.find_one_and_update({"_id": ObjectId(submission_id)}, {"$set": data}) + connection.close() diff --git a/judger_controller/settings.py b/judger_controller/settings.py deleted file mode 100644 index 4d492ebd..00000000 --- a/judger_controller/settings.py +++ /dev/null @@ -1,6 +0,0 @@ -# coding=utf-8 -redis_config = { - "host": "127.0.0.1", - "port": 6379, - "db": 0 -} \ No newline at end of file diff --git a/judger_controller/tasks.py b/judger_controller/tasks.py deleted file mode 100644 index 3f4e2559..00000000 --- a/judger_controller/tasks.py +++ /dev/null @@ -1,20 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import -from judger_controller.celery import app -import subprocess32 as subprocess - - -@app.task -def judge(solution_id, time_limit, memory_limit, test_case_id): - try: - subprocess.call("docker run -t -i --privileged --rm=true " - "-v /Users/virusdefender/Desktop/test_case/:/var/judger/test_case/ " - "-v /Users/virusdefender/Desktop/:/var/judger/code/ " - "judger " - "python judger/run.py " - "--solution_id %s --time_limit %s --memory_limit %s --test_case_id %s" % - (solution_id, str(time_limit), str(memory_limit), test_case_id), - # 设置最长运行时间是5倍的 cpu 时间 - timeout=(time_limit / 1000.0 * 5), shell=True) - except subprocess.TimeoutExpired: - print "docker timeout" diff --git a/submission/views.py b/submission/views.py index 1a008446..b0d9794d 100644 --- a/submission/views.py +++ b/submission/views.py @@ -9,8 +9,8 @@ from rest_framework.views import APIView from django.conf import settings -from judger.result import result -from judger_controller.tasks import judge +from judge.judger.result import result +from judge.judger_controller.tasks import judge from account.decorators import login_required from problem.models import Problem from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page