Я работаю над проверкой кода онлайн-судьи. Мой код использует многопоточность в python 2.7.Такая же программа на моей локальной машине (ядро 3 RAM 4GB) оценивает около 1000 подписок за 1 минуту 10 секунд. Но когда я запускаю его на экземпляр ec2 micro (около 600 МБ ОЗУ), он принимает около 40 минут (он замедляется для некоторых случайных секунд). Чтобы узнать причину, я сломал вещи.Почему многопоточная программа python работает медленнее на ec2 micro-instance?
Во-первых, это как мой оценщик работает:
- У меня есть основной программы
worker.py
, который создает несколько потоков - Основной поток вытягивает представления (10 в то время) из файла (на время) и помещает их в глобальную очередь
- Боковые потоки принимают подзапросы из очереди (одно представление оценивается исключительно одной нитью)
- Af тер боковой поток принимает представление он посылает его в функцию
compile
, которая возвращает исполняемое представление назад в эту тему - Затем поток передает этот исполняемый файл в функцию
run
, которая запускает исполняемый (с использованием песочницы с определенной памятью и временные рамки) и записывает вывод исполняемых в файл, а затем проверяют его
против стандартного вывода - После того, как очередь становится пустым основной поток снова тянет 10 представлений и помещает их в очереди
- У меня есть основной программы
Функции
compile
иrun
:- Функция компиляции и запуска функции сохранения исполняемого файла и вывод в файлы (repectively) под названием как
<thread_Name>.exe
и<thread_Name>.txt
так, что каждая нить имеет свои собственные файлы и нет вопрос перезаписи. - Поток идет запустить функцию только тогда, когда состояние из функции компиляции было в порядке (файл компилируется) в противном случае броски ошибки компиляции для , что представление
- Функция компиляции и запуска функции сохранения исполняемого файла и вывод в файлы (repectively) под названием как
Теперь сомнения у меня есть:
- Является ли проблема медленного выполнения на ec2 из-за ресурсов, которые у него есть или из-за , для многопоточности python. В моих сценариях потоки для доступа к глобальным переменным , такие как очередь (i put locks) и
test.py(I dont put lock on it)
, который в функции проверяет выход со стандартным выходным символом по символу (vimdiff like), иmysandbox.py(libsandbox the sandbox)
и некоторыми другими глобальными переменными. Так же работает медленная работа из-за GIL python. Если это , тогда почему работайте быстро на моей локальной машине. - Также на данный момент я даю тот же файл
test.cpp(adds two numbers and prints result)
1000 раз. Поэтому, когда я намеренно делаю ошибку компиляции в этом файле и запускаю мою основную программу на ec2, она работает довольно быстро.Из этого я пришел к выводу, что компиляция и и запуск (компиляция и запуск функций) моей программы занимают основное время, а не поток создания и управления.
- Является ли проблема медленного выполнения на ec2 из-за ресурсов, которые у него есть или из-за , для многопоточности python. В моих сценариях потоки для доступа к глобальным переменным , такие как очередь (i put locks) и
Я знаю его обширный вопрос, но любая помощь очень ценится (или мне придется держать Баунти на это пари всю свою репутацию :)).
да! обновленный до среднего сделал огромную разницу спасибо :) –
Рад это услышать. Если вы хотите сэкономить деньги, вы можете использовать небольшой, а не средний - все равно быть довольно быстрым и половину цены. –