OJ搭建:Judge0服务器、DeepSeek服务接入简介

        各大OJ平台上有很多很好的资源,但作为自己的“备课本”总有各种不便,教学生时间久了总是有一些自己的题目和想法,这在教初学的学生时非常突出。所以,很多年前就搞了一些尝试,包括:在机房搭建ubuntu服务器,找一个开源OJ安上,这过程中几经折腾,上梯翻墙的,别提多难受;然后想在云上搞一个,就可以随时访问了,由于学生少所以在阿里云上搞了仅2VCPU2G的配置,判题机制是轮询、本地判题,一直用了很多年。恰逢前两年被学校征用,于是升级了一次OJ,因为改了很多东西,所以又是几经折腾;之后DeepSeek火了,萌生了使用DeepSeek改学生代码的想法,建立了一个新的OJ。截至今天,当代的AI也没有多强的能力来完成编程题,当然成熟算法它们做的比较好。于是又几经折腾,通过一些技术方法达成让它可以正确的分析和解决学生被判定错误的当前代码并给予指导的目的。

        这一篇主要是介绍流程,由于对PHP和YII的熟练度差亿点,整个过程断断续续做了好几个月。作为一个记录,也给有想法的一点参考。

一、OJ搭建

        这个没有多难的地方,首先去云上租一个服务器,有公网IP即可,域名和是否备案不影响我们搭建实际服务。

0、找一个云服务商,我用的是阿里云,你要根据你所在地区来租用服务器,本省、隔壁省可能都行,太远的就很容易呵呵掉,别问我咋知道的,一问一个不吱声。

1、找一个开源OJ,我使用的是LPSZOJ,它是Php写的,提供了好几种安装脚本。

2、阅读其安装需求,然后在云服务器上安装对应版本。我使用的是阿里云,直接选择作者说明的测试过的ubuntu版本就可以。我使用的是ubuntu_20_04_x64。

3、进入控制台,运行安装脚本。不会的或者遇到困难,请留言给DeepSeek不要给我^ ^。

4、使用你ECS的公网IP地址访问你的网站。注意ECS的防火墙规则是否配置正确。

        一般来说,使用安装脚本在已测试过的系统版本下进行安装不会出现什么问题。

另外,如果你不想大动干戈去搞什么Judge0,而只想使用DeepSeek,也不是不行咯,忽略下一步直接看下下步。

二、开始捯饬Judge0

        先去到judge0.com,大体看看都有什么功能。它是一个传统判题机到目前为止不支持交互式和构造题,但是运行在沙盒里面,而且支持非常多的语言。

1、在OJ的云上再租一个服务器,但这个服务器的配置不低于2VCPU/4G内存。因为Judge0本身就会占用一定的内存,而2VCPU一般都是4线程,所以你最多一次评测4个测试点,若每个测试点限制内存为500Mb一下就可以正常工作。

2、安装Judge0服务器,并进行配置。不会的或者遇到困难,请留言给DeepSeek不要给我^ ^。

3、再云服务器上正确配置端口。

4、访问你Judge0所在ECS的works节点(其他官方文档上有的节点也可以),只要正常访问就可以,不必在意有没有返回数据或返回了什么数据,当你使用API调用了评测机之后它自然会有全格式的返回数据。

三、开始改造现有OJ

        我用的OJ是轮询式的,所以只需要从ECS的后台检查一下数据库的内容而后参考OJ的评测机代码和守护进程(C语言)就可以知道它是怎么实现的评测。弄清楚流程之后,我们着手写自己的服务程序来调用Judge0服务器进行评测。在整个判题流程中插入了我们自己的代码之后,可想而知后面进行其他改造就会非常得心应手了。

        当然,如果保持当前本地判题的方式,那么你只需要在OJ的判题机代码上增加几行代码,使之可以调用你的程序就可以了。例如根据不同的判题结果,调用不同的.py文件来与DeepSeek交互获得对学生代码的分析——这非常容易做,因为python的openai库是被DeepSeek直接支持的。最开始我也是这样做的,但随着需求增加,用一门达不到精通程度的语言来实现复杂任务实在是难受至极。所以,最后我还是回到了VB.NET的怀抱——估计这辈子也不可能精通python了。

        言归正传,现在我们应该好好规划一下Judge0的多线程判题过程,至于判题结果如何发送给DeepSeek都应该在判题机集群正确工作之后再进行。一般来讲,当用户提交代码之后我们进行以下操作:

1、我们通过查询数据库,得到等待评测的提交。

2、题目对应的每个测试点对于Judge0来讲都是一个评测(虽然可以批量提交,但我们自己控制判题机集群的负载均衡)。

3、为每个测试点调用Judge0API,等待返回结果。

4、将全部测试结果进行汇总,写回数据库。

至此,完成了判题机的工作。

        但我们需要考虑有很多个提交同时进行、有若干个Judge0服务器进行负载均衡的需求。所以,我们应该从判题服务的角度再来审视一下:

1、启动判题服务时,通过访问works节点检查Judge0服务器工作状况(判断是否在线、正在进行多少个任务、等待队列中有多少个任务)。

2、维持一个判题任务队列,其中保存构建Judge0API调用的信息。所有的提交的测试点都进入该队列。

3、使用Judge0Server类对判题任务队列进行轮询,并按照一定负载规则将任务摘取发送给制定的Judge0服务器。

4、维持一个各次提交的评测结果队列,其中保存题目对应的Judge0服务器返回的评测结果。每当一个提交的全部测试点均返回,我们对其进行汇总。而后写回数据库——PHP后台会自动更新前端页面。

        所以,我们的评测机比原OJ的阻塞式的本地评测机要复杂一些,这里面有一些生产——消费模型需要实现,但它能够承受更大的负载也不会由于对某些代码的评测导致出错从而使大面积的评测陷入长时间的等待。

四、接入DeepSeek

        当我们得到评测结果之后,就可以进行下一步操作:如果评测结果不为AC,那么将用户代码发送给DeepSeek来进行分析,将分析结果写入数据库,在前端设置等待和自动刷新功能即可。关于接入DeepSeek服务的代码可以参考上一篇。

       

        需要样品请留言,测试时手下留情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85738.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的锁机制问题

锁机制 1.锁监视器 在 Java 并发编程中,锁监视器(Monitor) 是对象内部与锁关联的同步机制,用于控制多线程对共享资源的访问。以下是核心要点: 🔒 监视器的核心组成 独占区(Ownership&#xff…

老凤祥的AI智能眼镜:让智慧更近生活

在科技进步的潮流中,人工智能技术不断为我们的生活增添色彩。近日,有关字节跳动旗下的火山引擎与中国珠宝品牌老凤祥合作开发 AI 智能眼镜的消息引发了广泛关注。这款与众不同的眼镜因其独特的功能及技术支持,已经在业内引起了极大反响。 AI眼镜:老年群体的智能好帮手 根…

Kotlin 中为什么没有静态变量和静态方法—不用static?

Kotlin 的设计核心是: 一切皆对象:消除 static 的「非对象」特性,用 companion(对象)和顶层函数(包级对象)替代,让代码更统一。避免全局状态滥用:static 成员是全局可见…

VSCode性能调优:从卡顿到丝滑的终极方案

⚡ 核心价值 "这套配置使某金融核心系统VS Code内存占用从8GB降至1.2GB,加载速度提升15倍" —— 2024某银行效能优化报告 🧩 性能瓶颈拆解 一、百万行项目优化方案 🚀 黄金配置参数 // settings.json(核弹级优化) {"files.watcherExclude": {"…

以云织梦,渡数济世:辉瑞与亚马逊云科技共谱医药新乐章

胖头陀科技 编辑:沐由 【导读】“用合规的数据来帮助患者,成为患者回归健康的一味新药。”当下,在数字洪流的浪潮中,这味“良药”正沿着云和AI的脉络,奔向有需求的千家万户…… 如果说到Pfizer,估计十个人…

SpringBoot后端开发知识点总结(持续更新)

目录 1. 常用易混淆注解解释1.1 Resource和Autowired注解的区别1.2 PathVariable和RequestParam注解的区别 2. Mybatis-Plus高级特性2.1 强大的通用CRUD接口2.2 代码生成器 3. IDEA实用快捷键4. 前后端联调关键点4.1 代码示例4.2 联调要点4.3 调试技巧 1. 常用易混淆注解解释 …

电脑商城--用户收货管理

新增收货地址 1 新增收货地址-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_address用户数据表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收货地址id,uid INT COMMENT 归属的用户id,name VARCHAR(20) COMMENT 收货人姓…

开发者避坑:接入Flux-Kontext API实现文生图、图生图功能

在数字化浪潮背景下,人工智能(Artificial Intelligence, AI)技术正加速重塑图像创作领域。智创聚合API平台近日宣布整合Flux-Kontext系列模型,通过API接口支持图生图和文生图功能,为开发者及创作者提供高效解决方案。此…

.Net Core 获取与bin目录相同文件路径的文件

在 .NET Core 中,您可以使用以下方法来获取与 bin 目录相同的文件路径。通常,bin 目录是应用程序编译后生成的输出目录,您可以使用 AppContext.BaseDirectory 或 Directory.GetCurrentDirectory() 来获取该目录的路径。 以下是一些常用的方法…

RN(React Native)技术应用中常出现的错误及解决办法

React Native 作为跨平台开发框架,在实际应用中可能会遇到一些常见的错误。以下是React Native 技术应用中常出现的错误及解决办法: 1. 网络请求失败(Network Request Failed) 原因: 请求地址不正确网络权限未配置i…

Java 21 的虚拟线程与桥接模式:构建高性能并发系统

Java 21 的虚拟线程与桥接模式:构建高性能并发系统 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

HTML5 火焰字体效果教程

HTML5 火焰字体效果教程 这里写目录标题 HTML5 火焰字体效果教程前言项目概述基本原理项目结构详细实现步骤1. HTML结构2. CSS样式3. JavaScript实现 代码详解1. 初始化设置2. 粒子系统3. 生成粒子4. 动画循环5. 交互控制 扩展和优化建议总结完整代码 前言 在这篇教程中&#…

SMOTE-XGBoost实战:金融风控中欺诈检测的样本不平衡解决方案

1. 行业问题背景 (1)金融欺诈检测的特殊性 在支付风控领域,样本不平衡是核心痛点。Visa 2023年度报告显示,全球信用卡欺诈率约为0.6%,但单笔欺诈交易平均损失高达$500。传统机器学习模型在此场景下表现堪忧&#xff1…

Instagram下载保存 -下载狗解析工具

在日常浏览Instagram时,是否有过这样的烦恼:看到一个精彩的视频,想要保存下来,却不知道如何操作?有时候我们会看到一些特别的旅行视频、搞笑片段,甚至是喜欢的名人分享的内容,简直是舍不得错过。…

flink如何基于Pekko实现RPC调用

摘要 通过阅读flink源码,了解flink是如何基于Pekko实现远程RPC调用的 Pekko实现远程调用 Flink 的 RPC 框架底层是构建在 Pekko 的 actor 模型之上的,了解Pekko如何使用,对后续源码的阅读有帮助。 Apache Pekko(原为 Akka 的一…

Kafka节点注册冲突问题分析与解决

一、核心错误分析 ERROR Error while creating ephemeral at /brokers/ids/1, node already exists and owner does not match org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode NodeExists问题本质:ZooKeeper中已存在ID为1的broker节…

突破PPO训练效率瓶颈!字节跳动提出T-PPO,推理LLM训练速度提升2.5倍

突破PPO训练效率瓶颈!字节跳动提出T-PPO,推理LLM训练速度提升2.5倍 在大语言模型(LLM)通过长思维链(CoT)展现出强大推理能力的当下,强化学习(RL)作为关键技术却面临训练…

【Python】dictionary

1 字典功能 字典是可变容器模型&#xff0c;且可存储任意类型对象&#xff1b; 字典的每个键值对 <key: value> 用冒号 : 分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value…

【python】If 语句

1 使用if 进行条件判断 1.1 检查字符串是否相等 car bmw car BMW # FALSEcar bmw car.upper() BMW # true # 变小写用方法&#xff1a;lower1.2 检查字符串是否不相等 my_car yadeaif my_car ! Audi:print("Buy one! Buy one! Buy one!")1.3 比较数字 answe…

Knife4j 使用详解

一、概述 Knife4j 是一款基于 Swagger 的开源 API 文档工具&#xff0c;旨在为 Java 开发者提供更美观、功能更强大的 API 文档生成、展示和调试体验。它是 Swagger-Bootstrap-UI 的升级版&#xff0c;通过增强 UI 界面和扩展功能&#xff0c;解决了原生 Swagger UI 界面简陋、…