随着ACM国际大学生程序设计竞赛如火如荼地开展,越来越多的大学开设了在线判题系统(OJ)用以训练自己的ACM队员。在线判题系统作为一类高级的程序设计训练平台,在国内只有少数高校拥有。其中由南京理工大学FishTeam团队开发的OnlineJudge_M6版本在线判题系统以其优越的性能和有好的用户界面在南京地区高校中广为流行,本文将以OnlineJudge_M6版本为基础,给出新版本以及新功能的实现与说明。
1。2 项目研究目的
采用在线判题系统,老师可以添加试题或者比赛,可以限制学生编程作业的语言,运行时间等参数。学生在提交代码后可以很快地得到判题节点的状态反馈来知道答案对错。一方面,在线判题系统可以对提交上来的代码自动编译,检查语法有无错误;另一方面可以通过许多测试数据来验证程序可否得出正确答案,包括时间和内存的限制。
在线判题系统的实现与应用,可以考核到学生掌握知识的真实水平,促进学生更好地学习计算机科学技术,提高学生动手编程能力;也可以节省老师的课后时间,避免时间浪费在枯燥乏味的阅卷上,也消除了老师批改试卷时的主观因素,增强了学生之间的公平性。
1。3 项目研究成果
本项目基于Linux操作系统,采用B/S架构,通过Django Web框架编写OnlineJudge系统。其中包括Web前端数据的显示与后端的业务逻辑处理以及与数据库的交互;还包括分布式判题节点的处理,实现以下功能:
用户社交功能的完善
自主出题以及虚拟比赛的实现
2 开发背景以及开发工具介绍
南京理工大学FishTeam开发团队负责的OnlineJudge的M6版本,基于Django开发,由JudgeSite端与Web端组成。其中JudgeSite端是基于Celery的分布式判题节点系统,他可以异步处理用户交互任务,这使得OnlineJudge_M6与其他在线判题系统相比有更快的响应速度。Web端则采用MTV开发模式,分为前端与后端;前端是网站的表示层并处理一些视觉效果,后端则需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能。
2。1 Celery 介绍
Celery是一个分布式的异步队列。在我们Judge的业务中,用来处理前台传来的交题任务。 对于交题的逻辑,我们现在是这样想的,前台发送交题任务后, 后台将这个任务封装,然后就丢给Celery这个分布式队列来进行调度。 然后立即返回一个结果页面,其中的结果状态随着刷新从数据库中读取。 而数据库中的状态是由丢给Celery的交题任务来实现更新的。
任务队列是一种在线程或机器间分发任务的机制。
消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。
Celery 用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程。
Celery 系统可包含多个职程和中间人,以此获得高可用性和横向扩展能力。
本文所实现的若干功能都在Web端,所以JudgeSite端Celery的技术与实现不做详细介绍。
2。2 Django 介绍
Django是一个高级Python Web框架,鼓励快速发展和清洁,务实的设计。由经验丰富的开发人员建造,它可以兼顾很多麻烦的网络开发,所以你可以专注于写你的应用程序,而不需要重新发明轮子。并且它是开源免费的。
为什么选用Django框架开发Web应用?首先相比于其他Web框架,Django 由Python编写,Python是一种功能极其强大的面向对象语言,并且简单易懂;而相比于其他Python Web框架,Django更为一体化,它安装简单且灵活多变,这很符合Python开箱即用的特点。选择Django,你无需安装其他组件就可以写程序运行,同时它的灵活性体现在每个部分都能拆下来换装其他组件,即集成度高且松耦合。Django旨在帮助开发者将应用尽快从理论模型到完成;它也可以帮助开发者避免许多的安全问题。