NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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 实践系列(四):网站监控脚本的实现》


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-08-16 15:3514499

评论

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

哪里可以查到网络安全等级测评与检测评估机构目录?

行云管家

网络安全 等保 等级测评

英特尔2022年投资者大会:以软件解锁更大增长机遇

科技新消息

看SparkSQL如何支撑企业级数仓

字节跳动数据平台

hive 字节跳动 Sparksql 数仓

【C语言】二维数组

謓泽

C语言 2月月更 二维数组

面对锁等待难题,数仓如何实现问题的秒级定位和分析

华为云开发者联盟

sql GaussDB(DWS) 锁等待 分布式死锁

感谢认可!一封又一封的感谢信

郑州埃文科技

IP地址 网络空间 地图测绘

移动应用中的第三方SDK隐私合规检测,早知道

华为云开发者联盟

移动应用 安全 sdk 隐私 隐私合规

祝贺!首届龙蜥社区年度突出贡献奖揭晓,马上查看

OpenAnolis小助手

Linux 开源 互联网 社群运营

SQL学习(持续更新)

阿丞

事务 索引 sql

会声会影2022语音转文字功能怎么用

懒得勤快

深入理解持续测试:DevOps 流程中的重要一环

SoFlu软件机器人

华为云企业级Redis揭秘第16期:超越开源Redis的ACID"真"事务

华为云开发者联盟

redis 事务 ACID GaussDB(for Redis) 开源Redis

突然发现,npm里request依赖包已经弃用,怎么办?

华为云开发者联盟

npm HTTP node,js Request request依赖包

数字孪生的起源,从救宇航员回家开始

Meta 小元

数据可视化 智慧城市 数字孪生 元宇宙

在线时序流程图制作工具

入门小站

再见了,我的散装研发管理平台;再见了,4台ECS!

阿里云云效

阿里云 DevOps 云原生 研发 敏捷研发

敏捷开发中的「史诗」到底是什么?

LigaAI

项目管理 敏捷开发 史诗

大咖说|极客邦CEO霍太稳对话阿里云存储负责人吴结生:我的数据存储20年(无限生长篇)

大咖说

阿里巴巴 InfoQ 存储线

Apache ShardingSphere 5.1.0 正式发布

SphereEx

数据库 开源社区 SphereEx Apache ShardingSphere

前端培训:Vue3语法糖详解分享

@零度

Vue 前端开发

外包学生管理系统的架构设计

yhjhero

#架构训练营

巧用EasyRecovery监控硬盘!为你的电脑保驾护航!

淋雨

EasyRecovery 数据恢复’

第十四节:SpringBoot使用JdbcTemplate访问操作数据库基本用法

入门小站

springboot

51WORLD赋能数字孪生流域/工程建设,助力智慧水利创新发展

Meta 小元

可视化 数字孪生 智慧水利 元宇宙

15 行代码在 wangEditor v5 使用数学公式

CRMEB

冬奥高质量炫技,Get同款“魔法”:图像处理算法 | 赠书

博文视点Broadview

《数字经济全景白皮书》数字冰雪篇 重磅发布

易观分析

数字经济 冬奥会

敏捷研发项目,我们该如何度量?

阿里云云效

阿里云 项目管理 云原生 度量 敏捷研发

java培训:JVM 内存布局

@零度

JVM JAVA开发

终极指南:企业级云原生 PaaS 平台日志分析架构全面解析

尔达Erda

微服务 云原生 PaaS 云原生应用

星巴克涨价引热议!中国现磨咖啡市场目前到底如何?

易观分析

星巴克涨价 中国咖啡市场

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