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

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

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

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

简单思路

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

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

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

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

基本实现

代码写入系统:

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就可以了。

额外的话

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

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

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

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

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

本文分享自微信公众号 - ServerlessCloudNative(ServerlessGo)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏凯哥Java

Java中反射学习系列教程之二

在上一篇文章《Java中反射学习系列教程之一》中我们学了什么是反射;反射中的反字怎么理解;以及反射的特点。今天我们主要讲的内容:

9420
来自专栏前端下午茶

[译] 使用 Proxy 来监测 Javascript 中的类

Proxy 对象(Proxy)是 ES6 的一个非常酷却鲜为人知的特性。虽然这个特性存在已久,但是我还是想在本文中对其稍作解释,并用一个例子说明一下它的用法。

10520
来自专栏前端桃园

分享一些少为人知但很有用的浏览器调试技巧

相信大部分前端同学都是用Chrome浏览器进行开发,这篇博客要分享的基本上是除了我们常用console.log之外的,Chrome开发者工具控制面板提供的调试方...

14540
来自专栏知识分享

12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯

对了,其实对于RTOS SDK版本的开发可以直接去参考非RTOS SDK的API  这个直接有例子

10520
来自专栏机器学习与python集中营

Python 3.8 新功能大揭秘

Python 3.8是Python语言的最新版本,它适合用于编写脚本、自动化以及机器学习和Web开发等各种任务。现在Python 3.8已经进入官方的beta阶...

10330
来自专栏前端下午茶

前端路由跳转基本原理

目前前端三杰 Angular、React、Vue 都推介单页面应用 SPA 开发模式,在路由切换时替换 DOM Tree 中最小修改的部分 DOM,来减少原先因...

29520
来自专栏小强的进阶之路

有了这些chrome插件,写程序就像开了挂一样

终于到周末了, 大家可以好好休息下,今天小强给大家带来了Chrome的强大的撸码插件,在写代码的时候做到事半功倍!

9660
来自专栏何白白开发记录

swagger-ui简要使用说明

在和springboot 进行集成的时候,因为springboot默认不会添加jar中的资源文件,导致api页面不能显示,所以需要手动的设置资源文件。

72530
来自专栏Spark学习技巧

终于有人把 Elasticsearch 原理讲透了!

搜索是现代软件必备的一项基础功能,而 Elasticsearch 就是一款功能强大的开源分布式搜索与数据分析引擎。

33530
来自专栏FreeBuf

Awake Security Platform:一款用NTA实现恶意行为检测的工具

随着企业及各类组织机构逐渐将网络的使用转向云和远程,传统网络的定义在逐渐发生变化。同样,物联网设备的使用越来越多,加密和影子系统的使用越来越频繁,我们也就可以理...

14430

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励