总得写点东西吧。
实际上这篇是为了防止半年后我再看自己代码看不懂的情况发生。
整个项目分为Web端和评测机端,分别是gitee上的两个项目。
https://gitee.com/yutong_java/HelloJudge2
https://gitee.com/yutong_java/HelloJudge2-Judger
主体开发语言为Python3.7+ES7+HTML5+CSS3+Cpp11。
Web后端采取Flask作为框架,前端采取Vue+jQuery作为框架(其中Vue负责页面渲染,jQuery负责AJAX),整体开发采取前后端分离。
后端路由/api/xxxx为前端调用的API接口,/ws/xxx为后端与前端实时通信的WebSocket的namespace(主要用来实时推送评测状态,私信,通知)。
后端所有模板页面继承自base.html,模板变量仅限APP_NAME(应用名)和DEBUG(调试模式)两个,其他所有数据都应该在前端渲染。
后端收到新的提交后,会存到数据库里,然后调用Celery增加一个新的Task,评测端收到新的Task后开始同步评测。
评测端使用Docker作为评测容器,每一次评测创建一个新的容器,评测完毕之后销毁,根文件系统挂载为只读。
在评测的的docker容器启动后一直阻塞,直到容器进程不存在,阻塞期间死循环读取容器的内存占用,此部分用C++实现。
发表回复