GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

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

2019 年 8 月 16 日

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 年 8 月 16 日 15:3514014

评论

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

CSP-J/S必备知识——文件输入输出

Jack—Li

CountDownLatch:别浪,等人齐再团!

王磊

Java 多线程

公安情报智能研判系统开发,智慧派出所平台建设解决方案

WX13823153201

公安情报智能研判系统开发

Elasticsearch结合MySQL的两种架构模式对比

读字节

MySQL kafka elasticsearch 数据同步 消息队列架构

JVM 诊断之 jstat 工具使用

hepingfly

Java JVM jvm调优 jstat

源码分析:Redisson分布式锁过程分析

程序员架构进阶

redis 源码分析 分布式锁 28天写作 3月日更

浅论指针(三)

Integer

c 指针

BOE(京东方)首度披露“千亿级西南战略” 全面布局物联生态

爱极客侠

IPFS挖矿会不会停电?IPFS节点怎么看?

投资矿机v:IPFS1234

IPFS挖矿会不会停电 IPFS节点怎么看

阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质

周老师

Java 编程 程序员 架构 面试

第9周作业

猫。

EGG NETWORK阿凡提公链全新一代算法稳定币之王EFTalk

币圈那点事

理解reflect elem和value的一段测试代码

werben

golang

2020年刊例花费达1,486亿,数字户外成必然趋势!

󠀛Ferry

七日更 3月日更

未来直播 “神器”,像素级视频分割是如何实现的 | CVPR 冠军技术解读

阿里云视频云

阿里云 算法 计算机视觉 音视频

三天研读《中兴电路设计规范》精华总结

不脱发的程序猿

28天写作 电路设计 3月日更 中兴 中兴电路设计规范

已助我拿到8个Offer!阿里巴巴Java面试参考指南(泰山版)

Java架构追梦

Java 编程 架构 面试参考指南 阿里巴巴泰山版

【无偿分享】史上最全Python学习大礼包 限24h删

sum56

Python Python基础 python入门 python学习 python资料

智慧派出所管理系统,派出所指挥调度平台搭建

13823153121

跟我学丨如何用鲲鹏服务器搭建Hadoop全分布式集群

华为云开发者社区

hadoop 服务器 集群 鲲鹏 Hadoop全分布式集群

加码技术破圈创新,蚂蚁金融科技助力各行各业转型升级

Lily

从两个模型带你了解DAOS 分布式异步对象存储

华为云开发者社区

开源 对象存储 存储 分布式异步对象存储 NVM

已拿到6个Offer!主动分享成功秘籍:阿里巴巴Java面试参考指南(2021最新版)

比伯

Java 架构 面试 程序人生 技术宅

阿里内部金三银四Java面试题被泄露!GitHub已封杀消息

周老师

Java 编程 程序员 架构 面试

有趣!一行代码居然无法获取请求的完整URL

Gopher指北

go HTTP

用 Go + WebSocket 快速实现一个 chat 服务

Kevin Wan

go websocket go-zero

[译文] 用故事点数评估开发工作真的好吗?

LigaAI

项目管理 程序人生 敏捷开发

腾讯游戏实时计算应用平台建设实践

Apache Flink

flink

这一次,彻底拿下计算机网络链路层!

神奇小汤圆

Java 程序员 架构 网络 计算机

产品训练营--第六期作业

曦语

产品训练营

NetCore的缓存使用详例

happlyfox

缓存 学习 netcore 3月日更

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