【发布时间】:2013-07-02 19:40:58
【问题描述】:
我正在开发 Online Judge 代码检查器。我的代码在 python 2.7 中使用多线程。我本地机器上的相同程序(i core 3 RAM 4GB)在 1 分 10 秒内评估了大约 1000 个提交。但是当我在 ec2 微型实例(大约 600 MB RAM)上运行它时,大约需要 40 分钟(随机数秒变慢)。要知道我把事情搞砸的原因。
-
首先这是我的评估器的工作方式:
- 我有一个主程序
worker.py,它创建了多个线程 - 主线程从文件(暂时)拉取提交(一次 10 个)并将它们放入全局队列中
- 侧线程从队列中获取提交(一个提交仅由一个线程评估)
- 侧线程接受提交后,会将其发送到函数
compile,该函数 将提交的可执行文件返回给该线程 - 然后线程将这个可执行文件发送给一个运行可执行文件的函数
run(使用具有定义的内存和时间限制的沙箱)并将可执行文件的输出写入文件,然后检查它
针对标准输出 - 队列变空后,主线程再次拉取 10 个提交并将它们放入队列
- 我有一个主程序
-
函数
compile和run:- compile 函数和 run 函数将可执行文件和输出保存在文件中(分别)命名为
像
<thread_Name>.exe和<thread_Name>.txt这样每个线程都有自己的文件 并且不存在覆盖问题。 - 仅当编译函数的状态为 OK(文件已编译)时,线程才会运行函数,否则会引发编译错误
那次提交
- compile 函数和 run 函数将可执行文件和输出保存在文件中(分别)命名为
像
-
现在我有疑问:
- 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 次。所以当我故意在这个文件中出现编译错误并运行我的 main ec2 上的程序运行速度非常快。据此我推断编译和 我的程序的运行(编译和运行函数)主要时间,而不是线程 创建和管理。
- ec2 上执行慢的问题是因为它拥有的资源还是由于
到python的多线程。在我的脚本中,线程访问全局变量
比如队列(我放了锁)和
我知道这是一个很大的问题,但任何帮助都非常感谢(否则我将不得不赌上我所有的名誉来继续赏金:))。
【问题讨论】:
标签: python multithreading python-2.7 amazon-ec2 sandbox