From f1915a8b339bb4a14bd7db929438ba0c1ff55e72 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 3 Jul 2015 20:10:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=9B=B4=E5=A5=BD=E7=9A=84?= =?UTF-8?q?=E5=8A=9E=E6=B3=95=E4=BF=AE=E5=A4=8DPython2=E4=B8=8D=E8=83=BDpi?= =?UTF-8?q?ckle=E5=AE=9E=E4=BE=8B=E6=96=B9=E6=B3=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 详见 https://virusdefender.net/index.php/archives/318/ --- judge/client.py | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/judge/client.py b/judge/client.py index c0abda8..53f0827 100644 --- a/judge/client.py +++ b/judge/client.py @@ -8,30 +8,16 @@ from settings import max_running_number, lrun_gid, lrun_uid, use_tmpfs from consts import Language, Result -# 下面两个函数告诉Python怎么pickle类实例中的方法,否则Python2会报错,是Python2的已知bug -# http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma/7309686 -def _pickle_method(method): - func_name = method.im_func.__name__ - obj = method.im_self - cls = method.im_class - return _unpickle_method, (func_name, obj, cls) - - -def _unpickle_method(func_name, obj, cls): - for cls in cls.mro(): - try: - func = cls.__dict__[func_name] - except KeyError: - pass - else: - break - return func.__get__(obj, cls) - - class JudgeClientException(Exception): pass +# 下面这个函数作为代理访问实例变量,否则Python2会报错,是Python2的已知问题 +# http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma/7309686 +def _run(instance, test_case_id): + return instance.judge_one(test_case_id) + + class JudgeClient(object): def __init__(self, language, exec_file_path, max_cpu_time, max_real_time, max_memory, test_case_dir): @@ -182,7 +168,7 @@ class JudgeClient(object): _results = [] results = [] for i in range(self.test_case_info["test_case_number"]): - _results.append(self.pool.apply_async(self.judge_one, args=(i + 1, ))) + _results.append(self.pool.apply_async(_run, (self, i + 1))) self.pool.close() self.pool.join() for item in _results: @@ -202,7 +188,7 @@ class JudgeClient(object): return self_dict -pickle(MethodType, _pickle_method, _unpickle_method) +# pickle(MethodType, _pickle_method, _unpickle_method) client = JudgeClient(language=Language.C, exec_file_path="/var/judge/a.out", max_cpu_time=1000000,