写点什么

Serverless 实践系列(三):突破传统 OJ 瓶颈,“判题姬”接入云函数

  • 2019-08-16
  • 本文字数:1739 字

    阅读完需:约 6 分钟

Serverless实践系列(三):突破传统OJ瓶颈,“判题姬”接入云函数

随着时代的发展,OJ 已经真正成为测评工具,其作用不再局限为 ACM 备战,还有老师检测学生能力、学生入学考试、能力评测(例如 ZJU 的 PAT)、找工作刷题和面试(例如牛客)等,而目前 OJ 的开源框架也越来越多,但是很多 OJ 都是基于 HUSTOJ 进行定制或者二次开发。


无论是什么方法,在 OJ 的众多问题中,有一个就是:性能问题。说实话,我在一些 OJ 群里,经常会看到有人问:1 核 1G 的机器,可以同时判多少题目?可以有多少人同时用?如果比赛,大约有多少人需要多高性能的机器?那么"判题姬"是否只能存在传统的宿主机中,能否通过其他方式焕发新的生命力?


有一种方法,就是和现有的云函数进行结合。

简单思路

通过云函数实现在线编程的思路基本有两个:


  • 每个用户的代码建立一个函数,用后删除;

  • 每个语言建立一个函数,用户传递代码,每次执行;


这两种方法,第一种无疑是简单的,但是目前对于很多云函数服务商来说,函数数量有一定限制,而且每次执行这个操作相对比较繁琐。


所以,本文采用第二种策略,建立一个函数,每次执行,用户传入代码,系统执行,返回结果。

基本实现

代码写入系统:


def WriteCode(code):    try:        with open("/tmp/mytest.py", "w") as f:            f.write(code)        return True    except Exception as e:        print(e)        return False
复制代码


执行代码:


def RunCode(input_data=None):    child = subprocess.Popen("python /tmp/mytest.py", stdin=input_data, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, shell=True)    error = child.stderr.read()    output = child.stdout.read()    return error, output
复制代码


代码和用例处理逻辑:


def main_handler(event, context):    if WriteCode(event["code"]):        try:            temp_list = []            for eve in event["input"]:                result = RunCode()                temp_list.append({"error":result[0].decode("utf-8"),"result": result[1].decode("utf-8"), "exception":""})            return json.dumps(temp_list)        except Exception as e:            return json.dumps({"error":"","result": "", "exception":str(e)})
复制代码


用户在传入数据的时候,需要注意事件为:


{  "code": "print('hello')",  "input": ["111","22222"]}
复制代码


这样就可以在每次请求的时候把代码传入(code),每个测试用例的 input 就是 input 内容。


本题输出结果:



此时,就实现了 Python 判题机的基本功能,此时通过腾讯云云 API:


https://cloud.tencent.com/document/api/583/17243)实现参数传入,通过


Explorer(https://console.cloud.tencent.com/api/explorer?Product=scf&Version=2018-04-16&Action=Invoke&SignVersion=


进行代码撰写,直接接入自己的 OJ 就可以了。

One More Thing

虽然这是一个简单的代码执行工具,但是实际上这个小工具可以在很多地方有着额外的应用。本文我只是再次只是抛砖引玉,例如我们做了一个 OJ,如果在本地跑代码可能性能和安全性都会受到挑战,那么此时,放入腾讯云云函数中,就会简单、安全、便捷的多,最主要的是腾讯云的函数调用免费额度很高。


此外,如果临时举办比赛,也不用费心费力扩容缩容,只要有云函数,后端的主要压力,都传给 Serverless 搞定,这也算是发挥了云函数的一个优势和特性。


那么,除了在 OJ 中使用的用途,它还有啥用?简单举两个例子:


  • Anycodes、Codepad 这些在线编程网站,之前很多人就问是如何实现的,试想一下,通过这个策略,是不是很好实现了在线编程?确切说,只需要一个前端,就可以实现在线写代码的一个网页。

  • 菜鸟教程这些网站,可以看代码然后点击运行,很炫酷的功能,很多小伙伴也想往自己博客增加一个类似的功能,也可以基于这个方法来实现。


作者介绍:


刘宇,腾讯云 Serverless 团队后台研发工程师。毕业于浙江大学,先后参与腾讯云云函数产品研发、自动扩缩容、CLI 等模块建设以及社区相关工作。本文转载自微信公众号 ServerlessCloudNative(ID:ServerlessGo)


《Serverless 实践系列(一):如何通过 SCF 与自然语言处理为网站赋能》


《Serverless 实践系列(二):为 Python 云函数打包依赖》


《Serverless 实践系列(四):网站监控脚本的实现》


2019-08-16 15:3515343

评论

发布
暂无评论
发现更多内容

亚信安慧荣膺“信创工委会技术活动单位”

亚信AntDB数据库

AntDB 国产数据库 AntDB数据库

产品路线图如何制定?斯坦福大学产品管理课程为你支招

LigaAI

产品经理 经验总结 产品管理 产品路线图 企业号9月PK榜

从融云数智办公平台,看企业需要什么样的大模型?

融云 RongCloud

人工智能 AI 互联网 AIGC 数智办公

HBuilder开发者必备!Windows上传IPA文件的软件分享

一种基于动态代理的通用研发提效解决方案

阿里技术

从“13天”到“0天”延时,揭秘幸福里离线SLA保障最佳实践

字节跳动数据平台

大数据 数据中台 数据治理 数据安全 企业号9月PK榜

WorkPlus AI助理,基于ChatGPT的企业级知识问答机器人

BeeWorks

文盘Rust——子命令提示,提高用户体验 | 京东云技术团队

京东科技开发者

rust cli 企业号9月PK榜 领域交互

「程序员转型技术管理」必修的 10 个能力提升方向

LigaAI

开发者 技术管理 经验总结 技术领导力 企业号9月PK榜

航空航天行业的MES系统解决方案

万界星空科技

MES系统

弹性数据库连接池探活策略调研(三)——DBCP | 京东云技术团队

京东科技开发者

数据库 数据库连接池 企业号9月PK榜 DBCP

Axios put 请求使用指南:优化开发流程

Apifox

程序员 前端 后端 axios put

头部媒体经观传媒传依托博睿数据,将故障排查效率提升60%

博睿数据

可观测性 博睿数据

谈谈JSF业务线程池的大小配置 | 京东物流技术团队

京东科技开发者

测试 测试用例 jsf 企业号9月PK榜

从软件工程师角度聊聊 Kubernetes

SEAL安全

容器 k8s 解决方案 kubernetes 运维 企业号9月PK榜

学会PCB通用布局规则,复杂设计也能轻松搞定!

华秋电子

PCB

可观测性在灰度发布中的应用

观测云

微服务 性能优化 链路

山东布谷科技直播APP源码搭建:核心的服务器系统

山东布谷科技

软件开发 系统架构 直播APP源码 服务器系统

视频剪辑中花式抠图的代码实操与案例详述

阿里云CloudImagine

云计算 阿里云

百度输入法全面升级,打造首个基于大模型的输入法原生应用

彭飞

Databend 数据集成方案 | Data Infra 第 15 期

Databend

打造次世代分析型数据库(二):这,不只是列存表

腾讯云大数据

数据库

大模型驱动云计算创新变革

Baidu AICLOUD

异构计算 百度百舸 千帆大模型平台 LMops AI 原生

WorkPlus Meet | 私有化部署视频会议系统,实现安全高效跨屏协作的利器

BeeWorks

一见“氢”心-康士柏氢能产业链蓄力待发

极客天地

智慧火力发电厂数字孪生3D可视化平台

2D3D前端可视化开发

智慧电厂 智慧火电厂 智慧火力发电厂 数字孪生火电厂 火电厂三维可视化

小红书广告智能创意能力构建过程详解

小红书技术REDtech

人工智能 小红书

球场LED显示屏应具备什么特点

Dylan

广告 足球 LED LED display LED显示屏

超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)

Immerse

Serverless实践系列(三):突破传统OJ瓶颈,“判题姬”接入云函数_语言 & 开发_刘宇_InfoQ精选文章