Online Judge 系统(简称 OJ)是一个在线的判题系统。用户能够在线提交多种程序(如C、C++、Pascal)源代码,系统对源代码进行编译和执行,并经过预先设计的测试数据来检验程序源代码的正确性。
随着时代的发展,OJ 已经真正地成为了测评工具,其做用再也不局限为 ACM 备战,还有老师检测学生能力、学生入学考试、能力评测(例如 ZJU 的 PAT)、找工做刷题和面试(例如牛客)等,而目前 OJ 的开源框架也愈来愈多,可是不少 OJ 都是基于 HUSTOJ 进行定制或者二次开发。前端
不管是什么方法,在关于 OJ 的众多问题中,有一个就是:性能问题。python
说实话,一些 OJ 群里,总会有人问:1 核 1G 的机器,能够同时判多少题目?能够有多少人同时用?若是比赛,大约有多少人须要多高性能的机器?那么『判题姬』是否只能存在传统的宿主机中,可否经过其余方式焕发新的生命力?git
其中一种方法,就是和现有的云函数进行结合。github
经过云函数实如今线编程的思路基本有两个:面试
这两种方法,第一种相对简单的,可是目前对于不少云函数服务商来讲,函数数量有必定限制,并且每次执行这个操做相对比较繁琐。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 内容。
以本题输出结果:
这样就实现了 Python 判题机的基本功能,此时经过腾讯云云 API 实现参数传入,经过 Explorer进行代码撰写,直接接入本身的 OJ 就能够了。
▎额外的话
虽然这是一个简单的代码执行工具,可是这个小工具还能够应用在不少其余地方。本文只是抛砖引玉,例如咱们作了一个 OJ,若是在本地跑代码可能性能和安全性都会受到挑战,那么此时,放入腾讯云云函数中,就会简单、安全、便捷得多,最主要的是腾讯云的函数调用免费额度很高。
此外,若是临时举办比赛,也不用费心费力扩容缩容,只要有云函数,后端的主要压力,都传给 Serverless 搞定,这也算是发挥了云函数的一个优点和特性。
那么,除了在 OJ 中使用的用途,它还有啥用?简单举两个例子:
除此以外,还有好多的用途,各位小伙伴们,快来本身挖掘吧!
做者介绍:
欢迎关注:腾讯云 Serverless 团队
咱们专一于 Serverless 架构的最佳实践!