我正在开发在线法官代码检查器。我的代码在 python 2.7 中使用多线程。我的本地机器(我的核心 3 RAM 4GB)上的相同程序在 1 分 10 秒内评估了大约 1000 次提交。但是当我在 ec2 微型实例(大约 600 MB RAM)上运行它时,大约需要 40 分钟(随机几秒钟会变慢)。要知道我把事情搞砸的原因。
首先这是我的评估员的工作方式:
- 我有一个主程序
worker.py
,它创建多个线程 - 主线程从文件(暂时)中提取提交(一次 10 个)并将它们放入全局队列中
- 侧线程从队列中获取提交(一个提交仅由一个线程评估)
- 侧线程接受提交后,将其发送到一个函数
compile
,该函数将提交的可执行文件返回给该线程 - 然后线程将此可执行文件发送到
run
运行可执行文件的函数(使用具有定义的内存和时间限制的沙箱)并将可执行文件的输出写入文件,然后
根据标准输出检查它 - 队列变空后,主线程再次拉取 10 个提交并将它们放入队列
- 我有一个主程序
功能
compile
和run
:- compile 函数和 run 函数将可执行文件和输出分别保存在名为 like的文件中
<thread_Name>.exe
,<thread_Name>.txt
这样每个线程都有自己的文件,不会出现覆盖问题。 - 仅当编译函数的状态正常(已编译的文件)时,线程才会运行函数,否则该提交会引发编译错误
- compile 函数和 run 函数将可执行文件和输出分别保存在名为 like的文件中
现在我有疑问:
- ec2 上执行缓慢的问题是由于它拥有的资源还是由于 python 的多线程。在我的脚本中,线程访问全局变量,例如队列(我放锁),
test.py(I dont put lock on it)
并且在运行函数中检查输出标准输出字符逐个字符(vimdiff 之类),以及mysandbox.py(libsandbox the sandbox)
其他一些全局变量。由于 python 的 GIL,工作缓慢也是如此。如果是这样,那么为什么它在我的本地机器上工作得很快。 - 另外暂时我给同一个文件
test.cpp(adds two numbers and prints result)
1000次。所以当我故意在这个文件中产生编译错误并在ec2上运行我的主程序时,它运行得非常快。由此我推断出编译和运行(编译和运行函数) 我的程序占用主要时间,而不是线程创建和管理。
- ec2 上执行缓慢的问题是由于它拥有的资源还是由于 python 的多线程。在我的脚本中,线程访问全局变量,例如队列(我放锁),
我知道这是一个很大的问题,但任何帮助都非常感谢(或者我将不得不继续悬赏它,赌上我所有的声誉:))。