AIGC革命已来,如何在企业场景落地?如何选择模型、怎样应用RAG、需要哪些组织流程配套? 了解详情
写点什么

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:3514469

评论

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

【JavaScript】数值转换为数值

恒山其若陋兮

5月月更

源码分析 Flutter 的 setState 过程

岛上码农

flutter ios 前端 跨平台开发 5月月更

企业架构如何促进创新?

涛哥 数字产品和业务架构

企业架构

三种常见的 Mac 安装 git 工具的方法

liuzhen007

git git 学习 5月月更

服务网格接口 SMI 规范解读

Flomesh

云原生 服务网格 SMI OpenServiceMesh

HDD·耀星领航出海峰会:华为游戏中心联运服务加速游戏出海获量增长

最新动态

你中奖了吗?低代码开发师(高级)认证中奖名单揭晓啦!

一只大光圈

钉钉宜搭

大家都在用哪些OKR管理工具?

PingCode

直播预告丨Hello HarmonyOS进阶课程第三课——游戏开发实践

HarmonyOS开发者

游戏开发 HarmonyOS

不会吧不会吧!听说还有人在手动迁移Vault密钥?

Jianmu

自动化 数据迁移 密钥 建木CI vault

企评家|广州白云国际机场股份有限公司成长性报告简述

企评家

HIVE3 深度剖析 (下篇)

明哥的IT随笔

大数据 hive

腾讯云发布全新非关系型数据库KeeWiDB 搭载全自研存储引擎

科技热闻

企评家,企业数据分析评价提供投资信息支撑

企评家

OpenHarmony浏览器上新,在Dayu200开发板上终于能优雅地浏览网页

离北况归

浏览器 OpenHarmony Openharmony啃论文俱乐部 PIMF OpenHarmony应用安装

宠物类自媒体运营心得:如何才能拍得更有创意

石头IT视角

druid 源码阅读 6——如何实现断链重连的?

张大彪

在线文本列表补集计算工具

入门小站

工具

李俊刚:我是如何在OpenHarmony完成ap6275s WiFi驱动的HDF适配工作的?

OpenHarmony开发者

OpenHarmony WiFi驱动

linux中vi,vim操作技巧

入门小站

Linux

柏拉图会成为元宇宙风险标吗?PlatoFarm的机会很大

小哈区块

先进数据中心背后,“东数西算”的三重意志

脑极体

零基础学Java第一节(语法格式、数据类型)

编程攻略

java 5月月更

企评家 | 白银有色集团股份有限公司成长性评价简介

企评家

飞书将于5月25日举行春季发布会 同步推出全新项目管理产品

陈泽涛

飞书 飞书项目

JavaWeb 数据库操作

Emperor_LawD

sql javaWeb 5月月更

抢先预约 | 阿里云无影云应用线上发布会预约开启

阿里云弹性计算

无影云电脑 云应用

Redis「5」事件处理模型与键过期策略

Samson

学习笔记 Redis 核心技术与实战 5月月更

学生管理系统(5)

5月月更

在线TSV转YAML工具

入门小站

工具

druid 源码阅读(七)Druid Filter 介绍

爱晒太阳的大白

5月月更

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