前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Serverless实践系列(三):突破传统OJ瓶颈,"判题姬"接入云函数

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

作者头像
腾讯云serverless团队
发布2019-07-11 17:39:21
1K1
发布2019-07-11 17:39:21
举报

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

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

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

简单思路

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

  1. 每个用户的代码建立一个函数,用后删除;
  2. 每个语言建立一个函数,用户传递代码,每次执行;

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

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

基本实现

代码写入系统:

代码语言:javascript
复制
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

执行代码:

代码语言:javascript
复制
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

代码和用例处理逻辑:

代码语言:javascript
复制
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)})

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

代码语言:javascript
复制
{  "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就可以了。

额外的话

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

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

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

  1. Anycodes、Codepad这些在线编程网站,之前很多人就问是如何实现的,试想一下,通过这个策略,是不是很好实现了在线编程?确切说,只需要一个前端,就可以实现在线写代码的一个网页。
  2. 菜鸟教程这些网站,可以看代码然后点击运行,很炫酷的功能,很多小伙伴也想往自己博客增加一个类似的功能,也可以基于这个方法来实现。

除此之外,还有好多的用途,各位小伙伴们,快来点击阅读原文自己挖掘吧!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ServerlessCloudNative 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档