突破传统OJ瓶颈 - "判题姬"接入云函数

目前随着在线编程在各行各业中的应用逐渐变多起来,传统的OJ也焕发了新的生机,不管是学校、我的仍是某些企业,都逐渐的开始使用OJ,传统的OJ可能只是测评,为ACM备战,可是随着时代的发展,OJ已经真正的成为了测评工具,其做用再也不局限为ACM备战,还有老师检测学生能努力,学生入学考试,能力评测(例如ZJU的PAT),找工做刷题和面试(例如牛客)等,而目前OJ的开源框架也愈来愈多,可是不少OJ都是基于HUSTOJ进行定制或者二次开发。可是不管是什么方法,在过去,OJ的众多问题中,有一个就是:性能问题。说实话,我也在一些OJ群里,我常常会看到有人问:1核1G的机器,能够同时判多少题目?能够有多少人同时用?若是比赛,大约有多少人须要多高性能的机器?那么"判题姬"是否只能存在传统的宿主机中,可否也焕发一下新的生命力?那就是和现有的云函数进行结合?前端

简单思路

经过云函数实如今线编程的思路基本有两个:python

1. 每一个用户的代码创建一个函数,用后删除;面试

2. 每一个语言创建一个函数,用户传递代码,每次执行;shell

这两种方法,第一种无疑是简单的,可是对于目前不少的云函数服务商都是对函数数量有必定限制,并且每次这个操做可能并是很是的理智。因此,咱们本文采用第二种策略,创建一个函数,每次执行,用户传入代码,系统执行,返回结果。编程

基本实现

代码写入系统:json

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复制代码

代码和用例处理逻辑:api

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内容。bash

以本题输出结果:

这样就实现了Python判题机的基本功能,此时经过腾讯云云API:cloud.tencent.com/document/ap…

实现参数传入,经过Explorer(console.cloud.tencent.com/api/explore…)进行代码撰写,直接接入本身的OJ就能够了。

额外的话

其实表面上这个就是一个简单的代码执行工具,可是实际上这个小工具能够在不少地方有着额外的应用,我再次只是抛砖引玉,例如咱们作了一个OJ,若是在本地跑代码可能性能和安全性都会受到挑战,那么此时,咱们放入腾讯云云函数中,就会简单、安全、便捷的多,最主要的是腾讯云的函数调用免费额度很高,同时,若是咱们由于临时举办比赛,也不用费心费力扩容缩容,只要有云函数,后端的主要压力,都传给serverless搞定,这也算是发挥了云函数的一个优点和特性,还有人说,除了这个在OJ中使用的用途,他还有啥用:

1: Anycodes,Codepad这些在线编程网站,以前不少人就问是如何实现的,试想一下,经过个人这个策略,是否是很好实现了在线编程?确切说,是否是只须要一个前端,就能够实如今线写代码的一个网页?

2: 菜鸟教程这些网站,能够看代码而后点击运行,很炫酷对吧,是否是有不少小伙伴也想往本身博客增长一个相似的功能?那么是否是也能够根据这个方法,来实现?

除此以外,还有好多的用途,各位小伙伴们,快来本身挖掘吧!

相关文章
相关标签/搜索