async def do_record(self): self.tag = self.request.pop('tag') self.type = self.request.pop('type') self.domain_id = self.request.pop('domain_id') self.pid = self.request.pop('pid') self.rid = self.request.pop('rid') self.lang = self.request.pop('lang') self.code = self.request.pop('code') try: if self.type == 0: await self.do_submission() elif self.type == 1: await self.do_pretest() else: raise Exception('Unsupported type: {}'.format(self.type)) except CompileError: self.end(status=STATUS_COMPILE_ERROR, score=0, time_ms=0, memory_kb=0) except ClientError: raise except Exception as e: logger.exception(e) await self.next(judge_text=repr(e)) await self.end(status=STATUS_SYSTEM_ERROR, score=0, time_ms=0, memory_kb=0)
async def handle(self): try: event = self.request.pop('event', None) if event: if event == 'problem_data_change': await self.update_problem_data() else: raise SystemError('Unknown event: {}'.format(event)) else: type = self.request.pop('type') if type == 0: await self.submission() elif type == 1: await self.pretest() else: raise SystemError('Unsupported type: {}'.format(type)) for key in self.request: logger.warning('Unused key in judge request: %s', key) except CompileError as e: self.end(status=STATUS_COMPILE_ERROR, score=0, time_ms=0, memory_kb=0) except Exception as e: logger.exception(e) self.next(compiler_text=repr(e)) self.end(status=STATUS_SYSTEM_ERROR, score=0, time_ms=0, memory_kb=0)
async def worker(): try: while True: request = await queue.get() await handler_type(self, request, ws).handle() except CancelledError: raise except Exception as e: logger.exception(e) await ws.close()
async def daemon(): async with VJ4Session(config['server_url']) as session: while True: try: await session.login_if_needed(config['uname'], config['password']) await update_problem_data(session) await session.judge_consume(JudgeHandler) except Exception as e: logger.exception(e) logger.info('Retrying after %d seconds', RETRY_DELAY_SEC) await sleep(RETRY_DELAY_SEC)
async def daemon(): try_init_cgroup() async with VJ4Session(config['server_url']) as session: while True: try: await session.login_if_needed(config['uname'], config['password']) done, pending = await wait([do_judge(session), do_noop(session)], return_when=FIRST_COMPLETED) for task in pending: task.cancel() await gather(*done) except Exception as e: logger.exception(e) logger.info('Retrying after %d seconds', RETRY_DELAY_SEC) await sleep(RETRY_DELAY_SEC)
async def do_record(self): self.tag = self.request.pop('tag') self.type = self.request.pop('type') self.domain_id = self.request.pop('domain_id') self.pid = self.request.pop('pid') self.rid = self.request.pop('rid') self.lang = self.request.pop('lang') self.code_type = self.request.pop('code_type') self.judge_category = self.request.pop('judge_category') self.judge_category = self.judge_category and self.judge_category.split( ',') or [] if self.code_type == CODE_TYPE_TEXT: self.code = self.request.pop('code').encode() else: self.code = path.join(mkdtemp(prefix='jd4.code.')) await self.session.record_code_data(self.rid, path.join(self.code, 'code')) logger.info('code dir: %s', self.code) # TODO(tc-imba) pretest not supported try: await self.prepare() if self.type == 0: await self.do_submission() elif self.type == 1: await self.do_pretest() else: raise Exception('Unsupported type: {}'.format(self.type)) except CompileError: self.end(status=STATUS_COMPILE_ERROR, score=0, time_ms=0, memory_kb=0) except ClientError: raise except Exception as e: logger.exception(e) self.next(judge_text=repr(e)) self.end(status=STATUS_SYSTEM_ERROR, score=0, time_ms=0, memory_kb=0)
async def daemon(): # 尝试初始化cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。 try_init_cgroup() # 创建异步回话连接jv4服务端 # config['server_url'] 获取配置文件数据 async with VJ4Session(config['server_url']) as session: while True: try: # 登陆JV4服务器 await session.login_if_needed(config['uname'], config['password']) # 运行两个协程 done, pending = await wait([do_judge(session), do_noop(session)], return_when=FIRST_COMPLETED) for task in pending: task.cancel() await gather(*done) except Exception as e: logger.exception(e) # 打印等待log logger.info('Retrying after %d seconds', RETRY_DELAY_SEC) # 等待30秒 await sleep(RETRY_DELAY_SEC)